交换带有自身副本的矢量

时间:2012-02-21 15:04:39

标签: c++ vector

在阅读代码时,我看到了:

vector<TypeA>(typeAObj).swap(typeAObj);

我的问题是

为什么他们将矢量与自身的副本交换?

2 个答案:

答案 0 :(得分:12)

这是C ++ 03中 shrink-to-fit 的模式,其中在vector类的接口中没有这样的操作。代码所做的是创建一个副本(希望向量的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之外的操作之后,向量的capacity() >= size()无法保证。

答案 1 :(得分:8)

我相信这是一种将矢量“缩小”到最小尺寸的方法。

vector<TypeA>(typeAObj)创建一个向量的副本,其保留大小可能小于原始大小。

因此,使用自身的新副本交换矢量可能是一种释放某些不需要的记忆的方法。