map遍历元素删除

map遍历删除元素与vector和list遍历删除不一样:

直接上代码:

template<typename T>
void vecDelElem(vector<T> *vect, T elem)
vector遍历删除正确方法:

 1 {
 2         typename vector<T>::iterator iter;
 3         for(iter=(*vect).begin(); iter!=(*vect).end(); )
 4         {
 5                 if(*iter == elem)
 6                 {
 7                         iter = (*vect).erase(iter);
 8                 }
 9                 else
10                 {
11                         iter++;
12                 }
13         }
14 }

 

所以联想到map的遍历删除,代码如下:

 

 1 for (map<pair<int, int>, vector<int> >::iterator iter = seqLinkMap.begin(); iter != seqLinkMap.end(); )
 2         {
 3                 if ( XXXXX )
 4                 {
 5                         iter = seqLinkMap.erase(iter);
 6                 }
 7                 else
 8                 {
 9                         iter++;
10                 }
11         }

 

编译一直报错:

error: no match for ‘operator=’ in ‘iter = seqLinkMap.std::map<_Key, _Tp, _Compare, _Alloc>::erase [with _Key = std::pair<int, int>, _Tp = std::vector<int>, _Compare = std::less<std::pair<int, int> >, _Alloc = std::allocator<std::pair<const std::pair<int, int>, std::vector<int> > >, std::map<_Key, _Tp, _Compare, _Alloc>::iterator = std::_Rb_tree_iterator<std::pair<const std::pair<int, int>, std::vector<int> > >](iter)’

原来根据STL std::map中的定义void erase(iterator pos),此erase并不返回下一个元素的迭代器,因此不能采用std::list的方法。

正确的方法是:

 

 1 for (map<pair<int, int>, vector<int> >::iterator iter = seqLinkMap.begin(); iter != seqLinkMap.end(); )
 2         {
 3                 if (XXXX)
 4                 {
 5                         seqLinkMap.erase(iter++);
 6                 }
 7                 else
 8                 {
 9                         iter++;
10                 }
11         }

 

 

 

posted @ 2014-03-23 17:08  shijun_xiao  阅读(1820)  评论(0编辑  收藏  举报