1

所以我有一个向量,最初是空的,但肯定会被填满。它包含结构的实例:

struct some {
    int number;
    MyClass classInstance;
}

/*Meanwhile later in the code:*/
vector<some> my_list;

发生这种情况时,我想为向量添加值,我需要将其放大一倍。但当然,我不想创建任何变量来做到这一点。如果没有这个要求,我会这样做:

//Adding new value:
some new_item;       //Declaring new variable - stupid, ain't it?
my_list.push_back(new_item); //Copying the variable to vector, now I have it twice!

所以,相反,我想new_item通过增加向量的大小来创建向量 - 看看:

int index = my_list.size();
my_list.reserve(index+1);  //increase the size to current size+1 - that means increase by 1
my_list[index].number = 3;  //If the size was increased, index now contains offset of last item

但这不起作用!似乎没有分配空间 - 我得到向量下标超出范围错误。

4

3 回答 3

5
my_list.reserve(index+1); // size() remains the same 

储备不变my_list.size()。它只是增加了容量。您将此与以下内容混淆resize

my_list.resize(index+1);  // increase size by one

另请参阅vector::resize() 和 vector::reserve() 之间的选择 。

但我推荐另一种方式:

my_vector.push_back(some());

额外的副本将从您的编译器中删除,因此没有开销。如果你有 C++11,你可以通过放置到向量中来更优雅地做到这一点。

my_vector.emplace_back();
于 2013-03-17T22:15:48.130 回答
2

std::vector::reserve仅确保分配了足够的内存,不会增加vector. 你正在寻找std::vector::resize.

此外,如果你有一个 C++11 编译器,你可以使用它std::vector::emplace_back来构建新项目,从而避免复制。

my_list.emplace_back(42, ... ); // ... indicates args for MyClass constructor
于 2013-03-17T22:15:58.450 回答
0

reserve()只是分配器请求空间,但实际上并没有填充它。尝试vector.resize()

于 2013-03-17T22:16:44.920 回答