用向量本身的副本交换向量
Swapping a vector with a copy of itself
在阅读代码时,我看到:
vector<TypeA>(typeAObj).swap(typeAObj);
我的问题是
为什么他们要用一个向量的副本来交换它呢?
这是收缩以适应C++03中的模式,在向量类的接口中没有这样的操作。代码所做的是创建一个副本(希望向量的capacity
将接近可用元素的数量),然后将其与原始向量交换。表达式完成后,临时缓冲区(现在保存原始缓冲区)将被丢弃,内存将被释放。
考虑:
std::vector<int> large;
large.reserve( 10000000 ); // might be the result of multiple push_back/erase
// large.capacity() >= 10000000
large.push_back( 1 ); // Make more explicit that 'large' might not be empty
std::vector<int>( large ).swap( large );
// large.capacity() is hopefully closer to 1
在C++11中,向量类型已被修改,以提供承担该角色的shrink_to_fit
操作。需要注意的是,旧模式和shrink_to_fit
都不是绑定操作,也就是说,在除capacity() >= size()
之外的操作之后,不能保证向量的capacity
。
我相信这是一种将向量"缩小"到最小大小的方法。
CCD_ 6创建保留大小可以小于原始大小的矢量的副本。
因此,用向量本身的新副本交换向量可能是释放一些不需要的内存的一种方式。
相关文章:
- 写入向量<向量<bool>>
- 函数向量_指针有不同的原型,我可以构建一个吗
- std::向量与传递值的动态数组
- 将值指定给向量(2D)的向量中的某个位置
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 如何使用向量的template_back函数
- 尝试通过多个向量访问变量时,向量下标超出范围
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- 构造字符串向量时是否有任何副本?
- 替代STD ::向量存储参考而不是对象的副本
- 构造向量时如何摆脱(一个)不必要的副本
- 在一个映射向量上迭代,如果满足条件,则插入一个副本
- 抽象类的shared_ptr向量到副本的向量
- 是否可以将向量初始化为附加额外元素的另一个向量的副本
- 指针是否可能在没有任何数据副本的情况下被向量所拥有
- 创建由shared_pointers向量的元素所指向的对象的副本
- 用向量本身的副本交换向量
- 如何在构造具有不同类型元素的向量副本时显式转换
- 对指针向量进行排序会更改该向量副本中的数据
- 如何在基类的向量中返回派生对象的副本