resize()
函数使vector包含所需数量的元素。如果我们需要的元素少于vector已包含的元素,则最后的元素将被删除。如果我们要求矢量增长,它将扩大其大小并用零填充新创建的元素。
vector<int> v(20);
for(int i = 0; i < 20; i++) {
v[i] = i+1;
}
v.resize(25);
for(int i = 20; i < 25; i++) {
v[i] = i*2;
}
但是如果我们在push_back()
之后使用resize()
,它会在新分配的大小之后添加元素,但不会在INTO中添加。在上面的示例中,结果的大小vector是25,而如果我们在第二个循环中使用push_back(),它将是30.
vector<int> v(20);
for(int i = 0; i < 20; i++) {
v[i] = i+1;
}
v.resize(25);
for(int i = 20; i < 25; i++) {
v.push_back(i*2); // Writes to elements with indices [25..30), not [20..25) ! <
}
那么resize()
功能的优势在哪里?它是否会为索引和访问向量中的元素造成混淆?
答案 0 :(得分:6)
听起来好像你应该使用vector::reserve
。
vector::resize
用于使用给定值初始化新创建的空间(或仅使用默认值。)函数的第二个参数是要使用的初始化值。
答案 1 :(得分:3)
请记住替代方案 - reserve
。当您想使用resize
运算符对向量进行操作时使用[]
- 因此您需要一个“空”元素表。 resize
不适用于push_back
。如果要为reserve
准备数组,请使用push_back
。
如果数组具有有意义的“空”构造函数,则可以创建空元素数组,并且仅更改有意义的数组,则调整大小非常有用。
答案 2 :(得分:3)
resize()
方法更改了向量的size
,这与向量的capacity
不同。
了解这两个值之间的区别非常重要:
size
是向量包含的实际元素的数量。capacity
是向量可以包含的最大元素数,而无需重新分配更大的内存块。向量capacity
始终大于或等于size
。向量的capacity
永远不会缩小,即使您减少其size
,也有一个例外:当您使用swap()
与其他向量交换内容时。正如其他人所提到的,您可以通过调用capacity
来增加向量的reserve()
。
我认为使用size
和capacity
的正确术语可以更容易理解C ++ vector
类,并清楚地说明其行为。
答案 3 :(得分:1)
resize()函数通过插入或删除向量中的元素来更改向量的实际内容。它不仅改变了它的存储容量。要仅在存储容量中指示更改,请使用vector :: reserve。看看link中的矢量可视化,注意v.back指向的位置。
答案 4 :(得分:0)
我真的不明白这种困惑。 resize
的优点是它可以调整矢量大小。必须执行push_back
s的循环既繁琐又可能需要多个“实际”调整大小。
如果要在不更改其可访问索引的情况下“调整”矢量大小,请使用std::vector<T>::reserve
。这将改变内部分配数组的大小而不实际“添加”任何东西。