************************************************
时间:2013年10月18日
作者:常保龙
地点:核所C105
************************************************
当删除容器中的元素时,总是或多或少遇到一些问题,要么是迭代器失效,要么是效率问题;不过幸好有Effective STL,让自己豁然开朗。如下规则:
1、标准序列容器:vector、deque、string、list
//判断式
bool badValue(int x);//返回x是否是"bad"
a)连续内存容器:vector、deque、string
v.erase(remove(v.begin(), v.end(), 100), v.end());//删除指定值的所有元素,O(n)
v.erase(remove_if(v.begin(), v.end(), badValue), v.end());//删除满足特定判定式的所有元素
//删除元素的同时,在循环体内做事
for (SeqContainer<int>::iterator i = c.begin(); i != c.end();){
if (badValue(*i)){
logFile << "Erasing " << *i << '\n';
i = c.erase(i);//返回已删除元素的下一个元素的迭代器
}
else{
++i;
}
}
b)非连续内存容器:list
v.remove(100);//删除指定元素,O(n)
v.remove_if(v.begin(), v.end(), badValue);//删除满足特定判定式的所有元素
//删除元素的同时,在循环体内做事
for (SeqContainer<int>::iterator i = c.begin(); i != c.end();){
if (badValue(*i)){
logFile << "Erasing " << *i << '\n';
/*方法一*/ i = v.erase(i); //返回已删除元素的下一个元素的迭代器
/*方法二 v.erase(i++); //返回已删除元素的下一个元素的迭代器*/
}
else{
++i;
}
}
2
、标准关联容器:set、map、multiset、multimap
v.erase(100);//删除指定元素,O(logn)
//删除满足特定判定式的所有元素
//方法一
AssocContainer<int> goodValues;
remove_copy_if(v.begin(), v.end(), inserter(goodValues, goodValues.end(), badValue));
v.swap(goodValues);
//方法二
for(AssocContainer<int>::iterator i = v.begin(); i != v.end();){
if(badValue(*i)){
v.erase(i++);
}
else{
++i;
}
}
//删除元素的同时,在循环体内做事
for (AssocContainer<int>::iterator i = c.begin(); i != c.end();){
if (badValue(*i)){
logFile << "Erasing " << *i << '\n';
v.erase(i++); //返回已删除元素的下一个元素的迭代器
}
else{
++i;
}
}