ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
[TOC] ### 使用 ***** 假如有一个标准容器: ``` Container<int> c; ``` 删除容器中指定的指;比如1963。 如果你有一个连续内存容器(vector、deque或string——参见条款1),最好的方法是**erase-remove**惯用法(参见条款32) ``` c.erase(remove(c.begin(), c.end(), 1963), c.end()); // 当c是vector、string 或deque时, // erase-remove惯用法 是去除特定值的元素 的最佳方法 ``` 这方法也适合于list,但是,正如条款44解释的,list的成员函数remove更高效: ``` c.remove(1963); // 当c是list时,remove成员函数是去除 特定值的元素的最佳方法 ``` 当c是标准关联容器(即,set、multiset、map或multimap)时: ``` c.erase(1963); // 当c是标准关联容器时 erase成员函数是去除 特定值的元素的最佳方法 ``` 这不仅是正确的,而且很高效,只花费对数时间。(序列容器的基于删除的技术需要线性时间。)并且,关 联容器的erase成员函数有基于等价而不是相等的优势,条款19解释了这一区别的重要性。 ### 总结 ***** ● 去除一个容器中有特定值的所有对象: 如果容器是vector、string或deque,使用erase-remove惯用法。 如果容器是list,使用list::remove。 如果容器是标准关联容器,使用它的erase成员函数。 ● 去除一个容器中满足一个特定判定式的所有对象: 如果容器是vector、string或deque,使用erase-remove\_if惯用法。 如果容器是list,使用list::remove\_if。 如果容器是标准关联容器,使用remove\_copy\_if和swap,或写一个循环来遍历容器元素,当你把迭代 器传给erase时记得后置递增它。 ● 在循环内做某些事情(除了删除对象之外): 如果容器是标准序列容器,写一个循环来遍历容器元素,每当调用erase时记得都用它的返回值更新你 的迭代器。 如果容器是标准关联容器,写一个循环来遍历容器元素,当你把迭代器传给erase时记得后置递增它