STL调整大小的优点()

时间:2010-02-08 05:32:44

标签: c++ stl

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()功能的优势在哪里?它是否会为索引和访问向量中的元素造成混淆?

5 个答案:

答案 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()

我认为使用sizecapacity的正确术语可以更容易理解C ++ vector类,并清楚地说明其行为。

答案 3 :(得分:1)

resize()函数通过插入或删除向量中的元素来更改向量的实际内容。它不仅改变了它的存储容量。要仅在存储容量中指示更改,请使用vector :: reserve。看看link中的矢量可视化,注意v.back指向的位置。

答案 4 :(得分:0)

我真的不明白这种困惑。 resize的优点是它可以调整矢量大小。必须执行push_back s的循环既繁琐又可能需要多个“实际”调整大小。

如果要在不更改其可访问索引的情况下“调整”矢量大小,请使用std::vector<T>::reserve。这将改变内部分配数组的大小而不实际“添加”任何东西。