用向量本身的副本交换向量

Swapping a vector with a copy of itself

本文关键字:向量 副本 交换      更新时间:2023-10-16

在阅读代码时,我看到:

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创建保留大小可以小于原始大小的矢量的副本。

因此,用向量本身的新副本交换向量可能是释放一些不需要的内存的一种方式。