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