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 }
原文:http://www.cnblogs.com/shijun-xiao/p/3619259.html