std::vector重新分配控制

4
通过阅读 std::vector 的参考资料,我了解到:
  1. 当达到最大容量时调用 insert 会导致 std::vector 重新分配内存(导致迭代器失效),因为新的内存具有更大的容量。目标是保持连续数据的保证。

  2. 只要不超过最大容量,insert 就不会导致这种情况(迭代器将保持完好)。

我的问题如下:
insert 自动调用 reserve 时,是否有办法控制需要预留多少新内存?
假设我有一个初始容量为100的向量,在达到最大容量时,我想再分配额外的20个字节。
是否有可能做到这一点?
1个回答

5
您可以随时跟踪它并在分配之前调用reserve,例如:
static const int N = 20 // Amount to grow by
if (vec.capacity() == vec.size()) {
  vec.reserve(vec.size() + N);
}
vec.insert(...);

你可以将这个代码块封装到一个函数中,然后调用该函数,而不是直接调用insert()方法。

我不认为这是明智的做法。调用reserve()将重新分配所有元素,然后在调用insert()时再获得另一组副本。此外,reserve()仅保证至少保留所请求的大小,并且实际上可能会保留更多。 - jrok
问题是如何控制它。这是您可以获得的最大控制力,即使它分配更多,您也永远不会获得未被此if语句捕获的分配,尽管它们可能比您要求的更大。 - Flexo
在这种情况下,我同意 - 从中获得的收益似乎不值得麻烦。我会在不使用移动设备时进行编辑。 - Flexo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接