1. map的erase函数使用
这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在。根据参考文献1:
在C++98中:
1
2
3
4
5 |
(1) void
erase (iterator position); (2)size_type erase ( const
key_type& k); (3) void
erase (iterator first, iterator last); |
在C++11中:
1
2
3
4
5 |
(1)iterator erase (const_iterator position); (2)size_type erase ( const
key_type& k); (3)iterator erase (const_iterator first, const_iterator last); |
这直接导致了在使用map类型的容器时,返回值可能不是指向当前删除元素的下一个迭代器的位置。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 |
map<string,string> mapTest; typedef
map<string,string>::iterator ITER; //<span style="color: rgb(255, 0, 0);">method 1:使用删除之前的迭代器定位下一个元素。 </span> for (ITER iter=mapTest.begin();iter!=mapTest.end();) { cout<<iter->first<< ":" <<iter->second<<endl; mapTest.erase(iter++); } <span style= "color: rgb(255, 0, 0);" > //method 2:erase() 成员函数返回下一个元素的迭代器 </span> for (map<string,string>::const_iterator iter=mapTest.begin();iter!=mapTest.end();) { cout<<iter->first<< ":" <<iter->second<<endl; iter=mapTest.erase(iter); } |
因此,method 2适合于C++11标准,而大多数时候,我们目前用的都是C++98标准,应该采用method 1.
2. vector的erase方法
根据文献2,:
c++98和c++11中,vector的erase方法基本上形式是一致的,只不过传入参数的迭代器的形式有所变化,在使用上,都采用类似于上述method 2的方法。
c++98:
iterator erase (iterator position);
iterator erase (iterator first,
iterator last);
c++11:
iterator erase (const_iterator position);
iterator erase (const_iterator
first, const_iterator last);
这点务必引起注意。
Reference
[1]http://www.cplusplus.com/reference/vector/vector/erase/
[2]http://www.cplusplus.com/reference/map/map/erase/
[3]http://www.cppblog.com/abware/archive/2014/04/22/72459.html
map 和 vector 的erase函数说明,布布扣,bubuko.com
原文:http://www.cnblogs.com/jiayouwyhit/p/3745113.html