矢量容量和储备
Vector capacity and reserve
本文关键字:容量 更新时间:2023-10-16
请考虑以下代码片段:
std::vector<int> v;
v.reserve(100);
v.insert(v.end(), 100, 5);
v.erase(v.begin(), v.end());
std::cout << v.capacity << std::endl;
这将打印出100
.这是否意味着矢量仍然包含 100 个内存位置?是否需要在向量上调用erase(begin,end)
后调用reserve(0)
,以放弃向量占用的所有空间?
如果容量为 100
,则vector
具有为 100 个元素分配的空间。 reserve(0)
是无操作的,因为reserve
不会缩小容量。
reserve(n)
将尝试将分配增加到至少 n
个元素的足够空间。不能保证它会成功,它不会报告失败,并且可能会过度分配。
不要调用reserve
,除非你已经测量了有和没有它的代码,并发现它有很大的不同。reserve
的所有其他用途都是过早优化。
您正在寻找著名的交换技巧:
vector<T>().swap(myVector);
请参阅此处以获取背景介绍
如何缩小标准::矢量?
提醒一下,C++0x/11 在 STL 容器中添加了shrink_to_fit
便利功能,该函数在 VS2010 中已经可用,所以如果你在 Windows(使用 VS)上编码,那就很幸运了。 :)
是的,向量仍然包含 100 个位置。 reserve
仅用于增加大小,不能缩小大小。reserve(0);
调用将完全不起作用。在 C++1x 中,我相信会有一个您感兴趣的shrink_to_fit
电话。
在当前标准中,您必须使用交换技巧来释放由向量分配的存储,但在这样做之前,请仔细考虑是否真的要这样做。如果稍后再次将元素添加回向量,则只会重新分配。除非您使用的是嵌入式系统,否则只需让 vector 管理自己的内存即可。
交换技巧:使用vector<T>().swap(myvector);
释放矢量的存储。
相关文章:
- 具有非整数边容量的最大流量的Dinic算法
- 将stl字符串缩小到小于15个字符的容量
- 在容量内调整矢量大小时的性能影响
- std::vector的容量会降低吗?
- 可视化C++载体:未使用的容量
- 如何在 c++ 中清除矢量容量?
- 当我将其插入无序地图时,矢量的容量为 0
- OLE DB 大容量复制操作始终将 true 加载到位列中
- 将结构 std::memcpy 转换为具有足够容量的 std::vector 是未定义的行为<char>吗?
- std::string::reserve没有被允许创建具有精确容量的std::string
- 当矢量改变容量时,有什么方法可以更新指针/参考值
- 使用准备好的语句大容量插入到postgresql
- 制作 std::矢量容量>=N 和大小=0 的最佳方法是什么?
- C++ STL 向量保留太多容量会消耗大量内存吗?
- 为 STD 载体模板专业化预留容量<bool>
- 英特尔 TBB 计算图:如何指定节点的输入队列容量
- 在 Linux 中禁用 USB 大容量存储设备的读取缓冲
- 在具有容量/调整大小的类中初始化向量
- 插入元素后矢量容量增加
- “调整大小”是否有降低矢量容量的风险