要避免你的vector持有它不再需要的内存,你需要有一种方法来把它从曾经最大的容量减少到它现在需要的容量。这样减少容量的方法常常被称为“收缩到合适(shrink to fit)”
class Contestant {...};
vector<Contestant> contestants;
vector<Contestant>(contestants).swap(contestants);
说明:
表达式vector(contestants)建立一个临时vector,它是contestants的一份拷贝:vector的拷贝构造函数做了这个工作。但是,vector的拷贝构造函数只分配拷贝的元素需要的内存,所以这个临时vector没有多余的容量。然后我们让临时vector和contestants交换数据,这时contestants只有临时变量修整过的容量,而这个临时变量则持有了曾经在contestants中的发胀的容量。在语句结尾,临时vector被销毁,因此释放了以前contestants使用的内存。从而contestants就只分配了适量的空间。
同样的技巧可以应用于string:
string s;
... // 使s变大
string(s).swap(s); // 在s上进行“收缩到合适”
交换技巧的变体可以用于清除容器和减少它的容量到你的实现提供的最小值。
vector<Contestant> v;
string s;
... // 使用v和s
vector<Contestant>().swap(v); // 清除v而且最小化它的容量
string().swap(s); // 清除s而且最小化它的容量
当然这种技巧不仅适用了vector string,任何其他容器也使用。
比如
map<string,int>().swap(wordFrequency_);