[置顶] STL 慎重选择删除元素的方法
2017-10-27 14:25
225 查看
假设你有一个容器,Containerc,针对连续内存容器(vector、deque或string),那么最好用erase-remove的习惯用法:
对于list,可以采用如下方式:
当c为标准关联容器时,例如set,multiset,map或multimap时,使用任何名为remove的操作都是完全错误的,使用remove算法会覆盖容器的值,因此正确的方法是:
那么如果有一个判别式,返回true至每个对象,例如:
对于顺序连续内存容器(vector、deque和string),可采用:
对于list,可采用:
对于关联容器,如何解决该问题,其中一种高效率的方式是:
如果需要在循环内进行操作,例如打印操作日志,那么该注意什么?
对于关联容器,直接在上述循环中加入日志写入语句即可:
如果是vector、string或deque容器,需要调整下:
一旦erase完成,它指向紧随着被删除元素的下一个元素的有效迭代器。对于list容器,上述两张方式均可以。
c.erase(remove(c.begin(),c.end(),4),c.end());
对于list,可以采用如下方式:
c.remove(4);
当c为标准关联容器时,例如set,multiset,map或multimap时,使用任何名为remove的操作都是完全错误的,使用remove算法会覆盖容器的值,因此正确的方法是:
c.erase(4);
那么如果有一个判别式,返回true至每个对象,例如:
bool badValue(int x){ return x>4; }
对于顺序连续内存容器(vector、deque和string),可采用:
c.erase(remove_if(c.begin(),c.end(),badValue),c.end());
对于list,可采用:
c.remove_if(badValue);
对于关联容器,如何解决该问题,其中一种高效率的方式是:
AssocContainer<int>c; ... for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){ if(badValue(*i)) c.erase(i++); else ++i; }
如果需要在循环内进行操作,例如打印操作日志,那么该注意什么?
对于关联容器,直接在上述循环中加入日志写入语句即可:
ofstream logFile; AssocContainer<int>c; ... for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){ if(badValue(*i)) { c.erase(i++); logFile<<"Erasing"<<*i<<std::endl; } else ++i; }
如果是vector、string或deque容器,需要调整下:
ofstream logFile; SeqContainer<int>c; ... for(AssocContainer<int>::iterator i=c.begin();i!=c.end()){ if(badValue(*i)) { i=c.erase(i); logFile<<"Erasing"<<*i<<std::endl; } else ++i; }
一旦erase完成,它指向紧随着被删除元素的下一个元素的有效迭代器。对于list容器,上述两张方式均可以。
相关文章推荐
- 慎重选择删除元素的方法STL
- [C++]关于STL慎重选择删除元素的方法
- STL中慎重选择删除元素的方法
- C++使用STL:慎重选择删除元素的方法
- C++使用STL:慎重选择删除元素的方法
- 慎重选择删除元素的方法
- Effective STL 读书笔记之慎重选择删除容器元素的方法
- 选择删除STL标准容器元素的方法
- 慎重选择删除元素的方法
- 第9条:慎重选择删除元素的方法
- STL慎重选择删除元素的
- 慎重选择删除元素的方法
- <Effectives STL>笔记之在STL容器中删除元素的方法选择
- effective stl 第九条: 慎重选择删除元素的方法
- 慎重选择删除元素的方法
- STL容器:删除元素,迭代器失效,选择时机
- STL中用erase()方法遍历删除元素
- Effective STL-各种容器正确删除元素方法
- STL中用ERASE()方法遍历删除元素
- 转载: STL序列式容器中删除元素的方法和陷阱三