标签: stdvector

C++:std :: vector :: reserve在包含指针时不保留

当我std::vector::reserve在标识符属性时调用时std::vector<Foo*> reserve(...)什么都不做:

std::vector<int*> bar;
bar.reserve(20);

//I expect bar.size to return 20...
std::size_t sz = bar.size();
for(std::size_t i = 0; i < sz; ++i) {
    //Do Stuff to all items!
}
Run Code Online (Sandbox Code Playgroud)

前面提到的for循环运行正好零次,bar.size()返回零.我不记得所有其他STL容器是否也是如此,但如果是这样,包括std :: vector的行为:为什么?

c++ stdvector

7
推荐指数
3
解决办法
2039
查看次数

何时复制矢量,何时传递参考?

我正在使用一个充分利用它的程序std::vector.还有很多分配/解除分配,数十亿分配,我试图避免尽可能多的分配/解除分配.由于我对C++比较陌生,所以我在使用向量时会有一些关于分配的问题(例如,在向其添加元素时).我在Win7 64位机器上,程序是32位,我正在使用当前版本的MinGW编译器.

我想知道,在下列情况下会发生什么,即如果复制了矢量,作为参考传递,...

1.

std::vector<T> fillVector() {
    std::vector<T> returnVector;
    ...
    return returnVector;
}

std::vector<T> myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)

2.

 std::vector<T>& fillVector() {
    std::vector<T>* returnVector = new std::vector<T>;
    ...
    return (*returnVector);
}

std::vector<T> myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)

3.

std::vector<T>* fillVector() {
    std::vector<T>* returnVector = new std::vector<T>;
    ...
    return returnVector;
}

std::vector<T>* myVector = fillVector();
Run Code Online (Sandbox Code Playgroud)

以下是不同的操作:

4.

std::vector<T> myVector1;
... (myVector1 being filled)
std::vector<T> myVector = myVector1;
Run Code Online (Sandbox Code Playgroud)

5.

std::vector<T>* myVector1 = new std::vector<T>;
... (myVector1 being filled)
std::vector<T> myVector = (*myVector1);
Run Code Online (Sandbox Code Playgroud)

假设我不想改变 …

c++ stl stdvector

7
推荐指数
2
解决办法
3322
查看次数

通过移动将向量附加到另一个(前C++ 11)

我正在处理一些相对较大的整数向量,我有一个顶级向量,我需要累积其他(临时)向量的结果.

将它扩展到原地很遗憾,因为我收到了从另一个API预先烹饪的临时向量,并且由于同样的原因我坚持使用GCC 4.1.2,所以没有一个很好的移动语义或std :: move of C++ 11.

目前我正在使用insert进行复制,例如:

vector<int> accumulator;
for(){
    vector<int> tempVector = vectReturningFunction();
    ...
    if(!tempVector.empty()){
        accumulator.insert(accumulator.end(), tempVector.begin(), tempVector.end());
    }
}
Run Code Online (Sandbox Code Playgroud)

由于临时常规是一次性的,数据可以足够大,我希望能够移动而不是复制,但我无法找到一种优雅的方式来做到这一点.

任何解决方案甚至只是指针(没有双关语意图)在一个有用的方向将非常感激.几年前,我对Stroustrup前C++ 11读取配方有一个模糊的记忆,可以跨越STL容器,但是现在有很多C++ 11的东西,没有多少搜索服务.

谢谢.

c++ move stdvector

7
推荐指数
1
解决办法
877
查看次数

在 C++11 中将 std::vector 移动到 std::deque

如果我有std::deque并且std::vector想要将它们组合到std::deque,我可以通过以下方式进行:

typedef int T; // type int will serve just for illustration
std::deque< T > deq(100); // just some random size here
std::vector< T > vec(50);
// ... doing some filling ...
// now moving vector to the end of queue:
deq.insert( 
    deq.end(), 
    std::make_move_iterator( vec.begin() ),
    std::make_move_iterator( vec.end() )
);
std::cout << deq.size() << std::endl;
Run Code Online (Sandbox Code Playgroud)

我们知道向量的大小,但我们不能在最后std::deque使用之前保留内存std::deque.insert(...)。那么这是将所有元素移动std::vector到末尾的最快方法std::deque吗?还是我错过了什么?

谢谢你。

c++ stdvector c++-standard-library c++11 stddeque

7
推荐指数
1
解决办法
3892
查看次数

C++ 标准向量 resize() 函数

resize() 根据给定的大小添加/删除元素。Reserve() 保留内存空间,它不会重新分配内存。我的问题是 resize 是否也与向量的容量相同,只是不会增加?

要添加,将组合:

 std::vector<X> vector;
 vector.reserve(5);
 vector.resize(5); 
Run Code Online (Sandbox Code Playgroud)

有道理吗?是多余的吗?这里的目标是能够覆盖向量中的值,而无需向量分配任何额外空间。

c++ resize stdvector

7
推荐指数
1
解决办法
8262
查看次数

如何将std :: vector <vector>转换为void*

我想知道如何将std :: vector转换为void*,例如,

std::vector<ColorData> piexls_ (w*h, background_color);
Run Code Online (Sandbox Code Playgroud)

现在我想将piexls_转换为(void*),以便我可以记忆pixel_.

memcpy ((void*)destinationBuffer->pixels_, (void*)sourceBuffer->pixels_, \
sizeof(ColorData)*destinationBuffer->width_*destinationBuffer->height_);
Run Code Online (Sandbox Code Playgroud)

但是,当我运行此代码时,我得到错误说 invalid cast from type ‘std::vector<image_tools::ColorData>’ to type ‘void*’

如何将std :: vector转换为void*.非常感谢!

c++ stdvector

7
推荐指数
1
解决办法
5044
查看次数

为什么在std :: array size_t和std :: vector中的size_type通常是size_t?

该文档说,size_type的std::vector是/ usually / size_t,这是合理的,因为实现可以选择使用不同的东西。

但是为什么size_type = size_t在std::array。特别是在这里,因为std::array使用很少µC,所以最好使实现具有一定的自由度。

这是文档缺陷吗?

c++ size-t stdvector stdarray

7
推荐指数
1
解决办法
101
查看次数

用新向量中的对应值替换向量中的所有奇数值

给定以下向量:

std::vector<int> foo{1,2,3,4,5,6,7};
std::vector<int> bar{10,20,30,40,50,60,70};
Run Code Online (Sandbox Code Playgroud)

最后,我想foo包含{ 10, 2, 30, 4, 50, 6, 70 }表示替换所有奇数的值。

我已经尝试过 std::replace_if 算法,但是如何访问条形对应的值?

// replace_copy_if example
#include <iostream>     // std::cout
#include <algorithm>    // std::replace_copy_if
#include <vector>       // std::vector

bool IsOdd (int i) { return ((i%2)==1); }

int main () {
  std::vector<int> foo{1,2,3,4,5,6,7};
  std::vector<int> bar{10,20,30,40,50,60,70};

  std::replace_if (foo.begin(), foo.end(), IsOdd, 0);

  std::cout << "foo contains:";
  for (auto i: foo){ std::cout << ' ' << i; }
  std::cout << '\n';

  return 0;
}

// output …
Run Code Online (Sandbox Code Playgroud)

c++ algorithm vector stdvector c++11

7
推荐指数
1
解决办法
290
查看次数

shared_ptrs 被删除两次

我想将指向Object类的共享指针存储在向量中:

测试代码:

#include <vector>
#include <iostream>
#include <memory>

using namespace std;   // only for brevity

class Object
{
public:
  int n;
  Object(int n) : n(n) { cout << "Object("  << n <<")\n"; }
  ~Object() { cout << "~Object(" << n << "))\n"; n = 0xdddddddd; }

};

void Test()
{
  std::shared_ptr<Object> p1(make_shared<Object>(Object(123)));
  std::vector<shared_ptr<Object>> v;

  cout << "before push_back\n";
  v.push_back(std::make_shared<Object>(Object(2)));
  v.push_back(p1);
  cout << "after push_back\n";

  cout << "Vector content:\n";
  for (auto& p : v)
    cout << "  " << …
Run Code Online (Sandbox Code Playgroud)

c++ vector shared-ptr stdvector c++11

7
推荐指数
2
解决办法
159
查看次数

我可以从 uint8_t(或 std::byte)范围初始化 std::vector&lt;bool&gt; 以便输入中的每一位都被视为布尔值吗?

我知道这std::vector<bool>很糟糕,但我有一个非常好的用例。

我想做这样的事情:

uint8_t data [] = {7,32};
std::vector<bool> vb/*...*/ ;
// now vb is size of 8 vector with this values:
//   false, false, false, false, false, true,  true,  true, (7)
//   false, false, true, false, false,  false, false, false (32)
Run Code Online (Sandbox Code Playgroud)

注意:我知道我可以手动解析输入的每个字节并进行 8 次插入,但我正在寻找标准中预先构建的内容

c++ stdvector

7
推荐指数
1
解决办法
265
查看次数