map中的erase成员函数用法
轉(zhuǎn)載于?http://www.cnblogs.com/graphics/archive/2010/07/05/1771110.html
?http://hi.baidu.com/sdkinger/item/dcad78e374707ff12b09a453
一、
#include <iostream> #include <map> #include <string> using namespace std ;int main(void) { map<int, string> m ;m.insert(pair<int, string>(1, "abc")) ;m.insert(pair<int, string>(2, "def")) ;m.insert(pair<int, string>(3, "def")) ;m.insert(pair<int, string>(4, "ghi")) ;map<int, string>::iterator itor ;// 錯(cuò)誤的寫法for (itor = m.begin(); itor != m.end(); ++itor){if (itor->second == "def"){m.erase(itor) ; // map是關(guān)聯(lián)式容器,調(diào)用erase后,當(dāng)前迭代器已經(jīng)失效 }}// 正確的寫法for (itor = m.begin(); itor != m.end();){if (itor->second == "def"){m.erase(itor++) ; // erase之后,令當(dāng)前迭代器指向其后繼。 }else{++itor;}}// 另一個(gè)正確的寫法,利用erase的返回值,注意,有些版本的stl-map沒有返回值,比如SGI版,但vc版的有for (itor = m.begin(); itor != m.end();){if (itor->second == "def"){itor = m.erase(itor) ; // erase的返回值是指向被刪除元素的后繼元素的迭代器 }else{++itor;}}// Print mmap<int, string>::const_iterator citor ;for (citor = m.begin(); citor != m.end(); ++citor){cout << citor->first << ":" << citor->second << endl ;}getchar() ; return 0 ; }?二、
STL的map表里有一個(gè)erase方法用來(lái)從一個(gè)map中刪除掉指令的節(jié)點(diǎn)
eg:
map<string,string> mapTest;
typedef map<string,string>::iterator ITER;
ITER iter=mapTest.find(key);
mapTest.erase(iter);
像上面這樣只是刪除單個(gè)節(jié)點(diǎn),map的形為不會(huì)出現(xiàn)任務(wù)問題,
但是當(dāng)在一個(gè)循環(huán)里用的時(shí)候,往往會(huì)被誤用,那是因?yàn)槭褂谜邲]有正確理解iterator的概念.
像下面這樣的一個(gè)例子就是錯(cuò)誤的寫法,
eg.
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}
這是一種錯(cuò)誤的寫法,會(huì)導(dǎo)致程序行為不可知.究其原因是map 是關(guān)聯(lián)容器,對(duì)于關(guān)聯(lián)容器來(lái)說,如果某一個(gè)元素已經(jīng)被刪除,那么其對(duì)應(yīng)的迭代器就失效了,不應(yīng)該再被使用;否則會(huì)導(dǎo)致程序無(wú)定義的行為。
可以用以下方法解決這問題:
正確的寫法
1.使用刪除之前的迭代器定位下一個(gè)元素。STL建議的使用方式
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter++);
}
2. erase() 成員函數(shù)返回下一個(gè)元素的迭代器
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
iter=mapTest.erase(iter);
}
?
?
注意:
map的earse應(yīng)注意:
map這種容器的下邊訪問和Vector等容器的下標(biāo)訪問有本質(zhì)的區(qū)別。?
對(duì)于Vector容器,用aVector[i]訪問第i個(gè)元素時(shí),如果元素不存在,容器不會(huì)增加元素,?
而對(duì)于map,用aMap[key]?
訪問鍵key對(duì)應(yīng)的對(duì)象時(shí),如果該鍵對(duì)應(yīng)的對(duì)象存在,則返回該對(duì)象(這和Vector一樣),但是,當(dāng)鍵值為key的元素不存在時(shí),容器會(huì)自動(dòng)的增加一個(gè)pair,鍵為key,而值則為一個(gè)容器定義時(shí)指定的類型并默認(rèn)初始化(即,如果該類型為基本類型,則初始化為0,比如本例中,aMap[1]的使用會(huì)產(chǎn)生一個(gè)pair,<1,NULL>,若該類型為類類型,則調(diào)用默認(rèn)構(gòu)造函數(shù)初始化之)?
顯然,本例中,aMap[1]為NULL,后面的erase()不會(huì)執(zhí)行,使得后面的?
插入語(yǔ)句aMap.insert(1,new A())鍵值沖突?
eg:如下代碼會(huì)導(dǎo)致錯(cuò)誤
#include <iostream>?
#include <map>?
using namespace std;?
struct A?
{?
A(int i)?
{?
x=i;?
}?
int x;?
};?
int main()?
{?
map<int,A*> amap;?
if ( amap[1] != NULL )?
amap.erase(1);?
amap.insert(make_pair(1,new A(1)));?
amap.insert(make_pair(2,new A(2)));?
amap.insert(make_pair(3,new A(3)));?
return 0;?
}
轉(zhuǎn)載于:https://www.cnblogs.com/hello-yz/p/3235187.html
總結(jié)
以上是生活随笔為你收集整理的map中的erase成员函数用法的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: grunt.config()_grunt
- 下一篇: SQL Server 迁移数据到MySQ