5

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

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

4

2 回答 2

9

来自 MSDN 参考1

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

ISO C++ 标准(第 485 2页)vector::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

所以是的,向量会忽略它,您不需要自己执行检查。

于 2012-05-06T20:59:20.023 回答
0

有点像。

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

当规范说超过尺寸末尾的元素将被删除时,这意味着就地。基本上它会为它正在删除的每个元素调用 _M_buff[i].~T() 。因此,假设一个有效的析构函数,您的对象分配的任何内存都将被删除,但对象本身占用的空间(它的大小)不会。向量将不断增长,不断增长,并增长到您告诉它的最大大小,并且在它存在时不会重新收缩。

于 2012-05-06T21:06:57.833 回答