交换带有自身副本的矢量

Tim*_*hko 10 c++ vector

在阅读代码时,我看到:

vector<TypeA>(typeAObj).swap(typeAObj);
Run Code Online (Sandbox Code Playgroud)

我的问题是

为什么他们用自己的副本交换一个向量?

Dav*_*eas 12

这是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
Run Code Online (Sandbox Code Playgroud)

在C++ 11中,已修改向量类型以提供shrink_to_fit承担该角色的操作.重要的是要注意,旧模式既不shrink_to_fit是绑定操作也不是绑定操作,也就是说,除了capacity操作之外的矢量没有保证capacity() >= size().


ere*_*eOn 8

我相信这是一种将矢量"缩小"到最小尺寸的方法.

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

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