首页 > 代码库 > map 和 vector 的erase函数说明

map 和 vector 的erase函数说明

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