来自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
答案 0 :(得分:4)
我认为你读错了。保留允许将capacity
设置为比您预留的更大的数量。特殊语言是允许实施重新分配,如果您预留的次数超过上次,但在达到当前容量之前。
答案 1 :(得分:0)
它需要更多时重新分配。您不需要预留两次。如果您正在进行大量插入并且您对存储的大小有很好的了解,那么使用reserve是个好主意。它快得多。
答案 2 :(得分:0)
您不需要两次致电reserve
。
此外,在发布的代码示例中,您只调用了reserve
一次。实际上,您粘贴的代码会影响向量的size
。有关void resize(size_type sz, const T& c);
:
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
次附加。