如果容器是一个标准关联容器,则使用它的 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。