看完《Effective STL》之后的确有很大的收获,发现 STL 里面的坑还真是不少,这里选了几条我认为比较重要的条款来说一说。
条款9:慎重选择删除元素的方法
STL中的 remove 和 erase 有时候的确会让人比较困惑,下面分三种情况详细讨论各类容器如何使用 remove 和 erase:
1. 要删除容器中有特定值的所有对象:
(1)若容器是 vector、string 或 deque,则使用 erase-remove 习惯用法:Container<int> c;
c.erase(remove(c.begin(), c.end(), value), c.end());
注意:remove 将值为非 value 的元素依次前移,覆盖值为 value 的元素,返回指向第一个应该废弃的元素的迭代器,不改变容器的大小。
(2)若容器是list,则使用其成员函数 list::remove(当然也可以使用如上方法),即:c.remove(value); // 无返回值,这是 list 最高效的删除方法
(3)若容器是一个标准关联容器,则使用它的 erase 成员函数,即:c.erase(value); // 无返回值