- 论坛徽章:
- 0
|
c.erase(1963); // 当c是标准关联容器时
// erase成员函数是去除
// 特定值的元素的最佳方法
这不仅是正确的,而且很高效,只花费对数时间。(序列容器的基于删除的技术需要线性时间。)并且,关
联容器的erase成员函数有基于等价而不是相等的优势,条款19解释了这一区别的重要性。
让我们现在稍微修改一下这个问题。不是从c中除去每个有特定值的物体,让我们消除下面判断式(参见条款
39)返回真的每个对象:
bool badValue(int x); // 返回x是否是“bad”
对于序列容器(vector、string、deque和list),我们要做的只是把每个remove替换为remove_if,然后就完成
了:
c.erase(remove_if(c.begin(), c.end(), badValue), // 当c是vector、string
c.end()); // 或deque时这是去掉
// badValue返回真
// 的对象的最佳方法
c.remove_if(badValue); // 当c是list时这是去掉
// badValue返回真
// 的对象的最佳方法
对于标准关联容器,它不是很直截了当。有两种方法处理该问题,一个更容易编码,另一个更高效。“更容
易但效率较低”的解决方案用remove_copy_if把我们需要的值拷贝到一个新容器中,然后把原容器的内容和
新的交换:
AssocContainer<int> c; // c现在是一种
... // 标准关联容器
AssocContainer<int> goodValues; // 用于容纳不删除
// 的值的临时容器
remove_copy_if(c.begin(), c.end(), // 从c拷贝不删除
inserter(goodValues, // 的值到
goodValues.end()), // goodValues
badValue);
c.swap(goodValues); // 交换c和goodValues |
|