有没有办法减少矢量的容量?
我的代码将值插入到向量中(事先不知道它们的数字),当这完成时,向量仅用于读取操作.
我想我可以创建一个新的向量,用大小做一个.reseve()并复制项目,但我真的不喜欢额外的复制操作.
PS:我不关心便携式解决方案,只要它适用于gcc.
aJ.*_*aJ. 39
std::vector<T>(v).swap(v);
Run Code Online (Sandbox Code Playgroud)
用另一个向量交换内容交换容量.
std::vector<T>(v).swap(v); ==> is equivalent to
std::vector<T> tmp(v); // copy elements into a temporary vector
v.swap(tmp); // swap internal vector data
Run Code Online (Sandbox Code Playgroud)
Swap()只会改变内部数据结构.
Mat*_*ice 14
去看看Scott Meyers Effective STL第17项.
基本上你不能直接减少一个存储大小std::vector.resize()并且reseve()永远不会减少容器的实际内存占用量."技巧"是创建一个合适大小的新容器,复制数据并与当前容器交换.如果我们想清除容器,这很简单:
std::vector<T>().swap(v);
Run Code Online (Sandbox Code Playgroud)
如果我们必须复制数据,那么我们需要复制:
std::vector<T>(v).swap(v);
Run Code Online (Sandbox Code Playgroud)
这样做会创建一个带有旧数据的新向量,执行任何具有所需效果的操作所需的副本.然后调用swap()将只交换对象之间的内部缓冲区.在该行的末尾,删除了创建的临时向量,但它具有来自旧向量的内容,而旧向量具有来自新副本的内容,这是我们需要的确切大小.
惯用的解决方案是与新构造的矢量交换.
vector<int>().swap(v);
Run Code Online (Sandbox Code Playgroud)
编辑:我误解了这个问题.上面的代码将清除向量.OP希望保持元素不受影响,只是缩小capacity()到size().
很难说aJ的代码是否会这样做.我怀疑是否有便携式解决方案.因为gcc,你必须看看它们的特定实现vector.
编辑:所以我偷看了libstdc ++实现.似乎aJ的解决方案确实有效.
vector<int>(v).swap(v);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15418 次 |
| 最近记录: |