日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

map中的erase成员函数用法

發布時間:2025/7/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 map中的erase成员函数用法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉載于?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 ;// 錯誤的寫法for (itor = m.begin(); itor != m.end(); ++itor){if (itor->second == "def"){m.erase(itor) ; // map是關聯式容器,調用erase后,當前迭代器已經失效 }}// 正確的寫法for (itor = m.begin(); itor != m.end();){if (itor->second == "def"){m.erase(itor++) ; // erase之后,令當前迭代器指向其后繼。 }else{++itor;}}// 另一個正確的寫法,利用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表里有一個erase方法用來從一個map中刪除掉指令的節點
eg:
map<string,string> mapTest;
typedef map<string,string>::iterator ITER;

ITER iter=mapTest.find(key);
mapTest.erase(iter);

像上面這樣只是刪除單個節點,map的形為不會出現任務問題,
但是當在一個循環里用的時候,往往會被誤用,那是因為使用者沒有正確理解iterator的概念.
像下面這樣的一個例子就是錯誤的寫法,
eg.
for(ITER iter=mapTest.begin();iter!=mapTest.end();++iter)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter);
}
這是一種錯誤的寫法,會導致程序行為不可知.究其原因是map 是關聯容器,對于關聯容器來說,如果某一個元素已經被刪除,那么其對應的迭代器就失效了,不應該再被使用;否則會導致程序無定義的行為。
可以用以下方法解決這問題:
正確的寫法
1.使用刪除之前的迭代器定位下一個元素。STL建議的使用方式
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
mapTest.erase(iter++);
}

2. erase() 成員函數返回下一個元素的迭代器
for(ITER iter=mapTest.begin();iter!=mapTest.end();)
{
cout<<iter->first<<":"<<iter->second<<endl;
iter=mapTest.erase(iter);
}

?

?

注意:

map的earse應注意:
map這種容器的下邊訪問和Vector等容器的下標訪問有本質的區別。?
對于Vector容器,用aVector[i]訪問第i個元素時,如果元素不存在,容器不會增加元素,?
而對于map,用aMap[key]?
訪問鍵key對應的對象時,如果該鍵對應的對象存在,則返回該對象(這和Vector一樣),但是,當鍵值為key的元素不存在時,容器會自動的增加一個pair,鍵為key,而值則為一個容器定義時指定的類型并默認初始化(即,如果該類型為基本類型,則初始化為0,比如本例中,aMap[1]的使用會產生一個pair,<1,NULL>,若該類型為類類型,則調用默認構造函數初始化之)?

顯然,本例中,aMap[1]為NULL,后面的erase()不會執行,使得后面的?
插入語句aMap.insert(1,new A())鍵值沖突?

eg:如下代碼會導致錯誤

#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;?
}

轉載于:https://www.cnblogs.com/hello-yz/p/3235187.html

總結

以上是生活随笔為你收集整理的map中的erase成员函数用法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。