在删除选项中仔细选择
- 去除一个容器中有特定值的所有对象
- 如果容器是vector、string或deque,使用erase-remove用法
- 如果是list,使用list::remove
- 如果是标准关联容器(set、multiset、map和multimap),使用它的erase成员函数
/*去掉整型容器里面所有值为1963的对象*/
//当c为vector、string或deque
c.erase(remove(c.begin(),c.end(),1963),c.end());
//当c是list
c.remove(1963);
//当c为标准关联容器时
c.erase(1963);
- 去除一个容器中满足一个特定判定式的所有对象
- 如果容器是vector、string或deque,使用erase-remove_if用法
- 如果是list,使用list::remove_list
- 如果是标准关联容器(set、multiset、map和multimap),使用remove_copy_if和swap,或者写一个循环遍历容器,当你把迭代器传给erase时记得后置递增它。
/*消除满足下列判断式的值*/
bool badValue(int x); // 判断x是否为bad
//如果c为vector、string或deque
c.erase(remove_if(c.begin(),c.end(),badValue),c.end());
//如果是list
c.remove_if(badValue);
//如果是标准关联容器
AssocContainer<int>c;
AssocContainer<int>goodValues; // 用于容纳不删除的值的临时容器
remove_copy_if(c.begin(),c.end(),inserter(goodValue,goodValue.end(),badValue);
c.swap(goodValue); // 交换c和goodValue
//上面方法拷贝了所有不删除的元素,拷贝开销较大
//第二种方法通过循环
AssocContainer<int>c;
for(AssocContainer<int>::iterator i=c.begin();i!=c.end();)
{
if(badValue(*i))
{
c.erase(i++);
}
else{++i;}
}
- 循环内做某些事情(除了删除对像之外)
*标准关联容器 写一个循环遍历容器,当你把迭代器传给erase时记得后置递增它
- 标准序列容器,每当调用erase时记得都用它的返回值更新迭代器
// 关联容器一旦被删除,指向那个元素的所有迭代器都失效了,所以需要在调用erase时后置递增
AssocContainer<int>c;
for(AssocContainer<int>::iterator i=c.begin();i!=c.end();)
{
if(badValue(*i))
{
c.erase(i++);
}
else{++i;}
}
// 序列容器一旦删除完成,它就指向紧接在被删除元素之后的元素的有效迭代器
SeqContainer<int>c;
for(SeqContainer<int>::iterator i=c.begin();i!=c.end();)
{
if(badValue(*i))
{
i=c.erase(i++);
}
else{++i;}
}