C ++ std :: vector内存/分配

时间:2010-05-03 22:13:06

标签: c++ memory stl vector

来自a previous question about vector capacity,贝利先生说:

  

在当前的C ++中,保证在调用保留之后不会发生重新分配,直到插入的大小超过上一次保留调用的值。在呼叫保留之前,或者在保留呼叫之后,当大小介于上一次保留呼叫的值和容量之间时,如果允许,则允许实施提前重新分配。

所以,如果我理解正确,为了确保在超过容量之前不会重新分配,我必须保留两次?你能澄清一下吗?

我正在使用vector作为这样的内存堆栈:

std::vector<double> memory;
memory.reserve(size);
memory.insert(memory.end(), matrix.data().begin(), matrix.data().end()); // smaller than size
memory.resize(memory.capacity(), 0);

我需要保证在上面不会发生重新分配。

谢谢。

ps:我还想知道是否有更好的方法以类似的方式管理内存堆栈而不是vector

3 个答案:

答案 0 :(得分:4)

我认为你读错了。保留允许将capacity设置为比您预留的更大的数量。特殊语言是允许实施重新分配,如果您预留的次数超过上次,但在达到当前容量之前。

答案 1 :(得分:0)

它需要更多时重新分配。您不需要预留两次。如果您正在进行大量插入并且您对存储的大小有很好的了解,那么使用reserve是个好主意。它快得多。

答案 2 :(得分:0)

您不需要两次致电reserve

此外,在发布的代码示例中,您只调用了reserve一次。实际上,您粘贴的代码会影响向量的size。有关void resize(size_type sz, const T& c);

的影响,请参见23.3.6.2.11(C ++ 0x FCD)
if (sz > size())
    insert(end(), sz-size(), c);
else if (sz < size())
    erase(begin()+sz, end());
else
     ; // do nothing

因此,基本上,当您拨打memory.resize(memory.capacity(), 0)时,实际上,在您致电0之后,您实际上会在memory.capacity() - memory.size()memory.insert次附加。