STL的矢量调整大小

时间:2012-05-06 20:57:20

标签: c++ stl vector

我找不到这条信息。我正处理一个奇怪的情况,我在一个循环中,我可以在任何给定的时间获得随机信息。该信息必须存储在矢量中。现在每个帧我必须设置这个向量,以确保我不会占用空间(我正在使用索引将值写入向量中的随机点)。

现在假设没有办法改变这段代码,我想知道,如果我发送的参数恰好是向量的大小,那么向量是否“忽略”resize()函数?我在哪里可以找到这些信息?

2 个答案:

答案 0 :(得分:9)

来自MSDN参考1

  

如果容器的大小小于请求的大小_Newsize,则元素将添加到向量中,直到达到请求的大小。如果容器的大小大于请求的大小,则删除最靠近容器末尾的元素,直到容器达到_Newsize大小。如果容器的当前大小与请求的大小相同,则不采取任何措施

ISO C ++标准(第485页2vector::resize

指定此行为
void resize ( size_type sz , T c = T ());

if ( sz > size ())
  insert ( end () , sz - size () , c );
else if ( sz < size ())
  erase ( begin ()+ sz , end ());
else
; // Does nothing

所以是的,矢量忽略了它,你不需要自己进行检查。

答案 1 :(得分:0)

有点儿-几分。

简单地使用resize()调整向量大小只会导致向量本身使用更多内存(将改变其元素使用的内存量)。如果预留空间中没有足够的空间,它将重新分配(有时他们喜欢自己填充一点,即使你有可能增长)。如果已经有足够的空间容纳所要求的尺寸以及它想做的任何填充,它就不会再生。

当规范说明超出大小结尾的元素将被删除时,它意味着到位。基本上它会为它正在删除的每个元素调用_M_buff [i] .~T()。因此,假设一个正在运行的析构函数,你的对象分配的任何内存都将被删除,但是对象本身占用的空间(它的大小)将不会被删除。矢量将会生长,生长,并且会增长到您告诉它的最大尺寸,并且在它存在时不会再收缩。