background image

如果容器是一个标准关联容器,则使用它的 erase 成员函数。

要删除容器中满足特定条件的所有对象:

如果容器是 vector、string 或 deque,则使用 erase-remove_if 习惯用法。

如果容器是 list,则使用 list::remove_if。

如果容器是一个标准关联容器,则使用 remove_copy_if 和 swap,或者写一个循环遍

历容器的元素,记住当把迭代器传给 erase 时,要对它进行后缀递增。
AssocCOntainer<int> c;
...

AssocContainer<int> goodValues;
remove_copy_if(c.begin(), c.end(), inserter(goodValues, goodValues.end()),badValue);

c.swap(goodValues);


for(AssocContainer<int>::iterator i = c.begin();i !=c.end();/* do nothing */){
if(badValue(*i)) c.erase(i++);

else ++i;
}

要在循环内部做某些(除了删除对象之外的)操作:

如果容器是一个标准序列容器,则写一个循环来遍历容器中的元素,记住每次掉用

erase 时,要用它的返回值更新迭代器。

如果容器是一个标准关联容器,则写一个循环来遍历容器中的元素,记住每次把迭

代器传给 erase 时,要对迭代器做后缀递增。

第 10 条:了解分配子(allocator)的约定和限制。

第 11 条:理解自定义分配子的合理用法。

第 12 条:切勿对 STL 容器的线程安全性有不切实际的依赖。

对一个 STL 实现你最多只能期望:

多个线程读是安全的。
多个线程对不同的容器写入操作是安全的。

你不能期望 STL 库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程支持。

第 2

 

章 vector 和 string

第 13 条:vector 和 string 优先于动态分配的数组。

如果用 new,意味着你要确保后面进行了 delete。

如果你所使用的 string 是以引用计数来实现的,而你又运行在多线程环境中,并认为

string 的引用计数实现会影响效率,那么你至少有三种可行的选择,而且,没有一种选择

是舍弃 STL。首先,检查你的库实现,看看是否可以禁用引用计数,通常是通过改变某个

预处理变量的值。其次,寻找或开发一个不使用引用计数的 string 实现。第三,考虑使用
vector<char>而不是 string。vector 的实现不允许使用引用计数,所以不会发生隐藏的多线

程性能问题。

第 14 条:使用 reserve 来避免不必要的重新分配。

通常有两种方式来使用 reserve 以避免不必要的重新分配。第一种方式是,若能确切知道

或大致预计容器中最终会有多少个元素,则此时可使用 reserve。第二种方式是,先预留足

够大的空间,然后,当把所有的数据都加入后,再去除多余的容量。

第 15 条:注意 string 实现的多样性。

如果你想有效的使用 STL,那么你需要知道 string 实现的多样性,尤其是当你编写的

代码必须要在不同的 STL 平台上运行而你又面临着严格的性能要求的时候。

第 16 条:了解如何把 vector 和 string 数据传给旧的 API。