STL容器分为Sequence container(vector, deque, list)和associative container(set, multiset, map, multimap)。 C++标准中, sequence container的erase函数会返回iterator, 但是associative container却不会返回。 Visual STudio中实现了,但是在gcc下却不能编译通过,所以为了解决兼容问题,在gcc需要写成a.erase(b++)
如果容器是一个标准序列容器,则写一个循环来遍历容器中的元素,记住每次掉用erase时,要用它的返回值更新迭代器。
如果容器是一个标准关联容器,则写一个循环来遍历容器中的元素,记住每次把迭代器传给erase时,要对迭代器做后缀递增。
1. 如果容器是vector、string或deque,则使用erase-remove/remove_if习惯用法。注意需要使用头文件<algorithm>, 否则编译不会通过
SeqContainer<int> c;
c.erase(remove(c.begin(),c.end(),1963),c.end());
只有通过这种方式才能使得迭代器恢复正常,不影响下次使用
2. 如果容器是list,则使用list::remove/list::remove_if
list_.remove_if(条件)
push_back, remove
eg1: remove_if
typedef std::list<NodeRelation> NODE_RELATION_LIST; typedef std::list<NodeRelation>::iterator NODE_RELATION_LIST_ITERATOR; class NodeCompare { public: NodeCompare(int id, int nodeid) : id_(id), node_id_(nodeid) { } bool operator()(const NodeRelation &rel) { return (rel.id_ == id_) && (rel.nodeid_ == node_id_); } private: int id_; int node_id_; }; NODE_RELATION_LIST nodeList_; nodeList_.<span style="color:#3333ff;">remove_if(NodeCompare(id,nodeid)); </span> 记得有时候在使用list等容器的时候需要使用list.clear()确保这个list开始是处于空的状态
eg 2: std::list<int> list;
int a= 1;
list remove(a);
3. map删除某个迭代器,
timer_map_.insert(TimerValueType(timer_type, timer_sys_id));//only add id which is not -1
erase()
<pre class="cpp" name="code">typedef std::map<int, long> TIMER_MAP; typedef std::pair<TIMER_MAP::iterator, bool> TimerMapPair; typedef TIMER_MAP::value_type TimerValueType; void StopAllTimer() { TIMER_MAP::iterator iter = timer_map_.begin(); long timer_sys_id = -1; for(; iter != timer_map_.end();) { timer_sys_id = iter->second; if(-1 != timer_sys_id)//if found, it cannot be -1 { <span style="color:#3333ff;">timer_map_.erase(iter++); </span> } else { iter++; } } return ; 4.需要用const_iterator记录迭代器轮询到的一个问题,下次仅仅轮询到这个位置。
vector<int> list1; typedef vector<int>::iterator list_iter; typedef vector<int>::const_iterator list_iter_const; list_iter_const iter_rec; for(int i=0; i < 10; i ++) { list1.push_back(i+1); } for(list_iter iter = list1.begin(); iter != list1.end(); iter++) { if(*iter == 5) { cout<<"find 5"<<endl; iter_rec = iter; //iter_rec(iter); //advance(iter_rec,distance<list_iter_const>(list1.begin(),iter)); } } list_iter iter1 = list1.begin(); //Iter i(d.begin());//使i指向d的起始位置 //advance(iter_rec,distance<list_iter>(iter1,iter_rec)); for(; iter1 != iter_rec; iter1++) { if(*iter1 == 3) { cout<<"find 3"<<endl; } }
5. 需要将const_iterator转换为iterator
<pre class="cpp" name="code"> <span style="color:#ff0000;">list_iter itercopy (list1.begin()); </span> advance(itercopy,distance<span style="color:#3333ff;"><list_iter_const>(</span>list1.begin(),iter_rec)); cout<<"itercopy's value"<<*itercopy<<endl;
itercopy必须赋初值,将他移到const_rec所值的迭代器, 最后得到位置为5的iterator