一、插入相同鍵元素操作
(1)insert方法
在map中的鍵必須是唯一的,當想map中連續插入鍵相同但值不同的元素時,編譯和運行時都不會發生任何錯誤,系統會忽略后面的對已存在的鍵的插入操作,如
1 map<int,int> m1; 2 m1.insert(make_pair(1,2)); 3 m1.insert(make_pair(1,3)); 4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){ 5 cout<<mit->first<<":"<<mit->second<<endl; 6 }
在第二行和第三行分別插入鍵都為1,但值不同的數據,此操作會忽略第三行的插入操作,其程序運行結果為:
1:2
通過insert方法插入操作容易誤解:
1. 認為插入相同鍵的操作會報錯(正解:插入相同鍵的操作,無論是編譯和運行時都不會報錯)
2. 對插入相同鍵的數據時,后面的插入操作的值會覆蓋前面的值,例如會誤認為該例子中第三句的插入操作會使最終鍵為1的數據對應的值會被修改為3(正解:對於插入的數據的鍵值已存在,那么這個插入操作將會被忽略)
(2)通過下標操作
向map中插入元素還可以用數組(關聯數組)下標的方式,先看下面的例子
1 map<int,int> m1; 2 m1[1]=2; 3 m1[1]=3; 4 for(map<int,int>::iterator mit=m1.begin();mit!=m1.end();mit++){ 5 cout<<mit->first<<":"<<mit->second<<endl; 6 }
運行結果
1:3
這段代碼與insert示例中的代碼差別只在第2,3行,而從結果上看通過下標方式插入元素操作后面的賦值操作覆蓋了前面的賦值操作。稍后會進一步對下標操作進行分析。
二、查找並讀取map中的元素
map容器最大的優點就在於它可以快速定位並讀取某一鍵值的元素。
(1)通過下標查找
如下代碼所示
1 map<string,int> m1; 2 cout<<m1["abc"]<<endl; 3 m1["abc"]=8; 4 cout<<m1["abc"]<<endl;
運行結果:
0 8
由上面的代碼可以看到,我們可以非常方便的通過數組下標的方式對map中的元素進行訪問。但你可能對第2行的輸出會有一些疑惑,因為最初map是空的,直接讀取一個不存在的鍵,其居然會有正常的輸出結果(可能並不是我們想要的),而之前我們並沒有對該鍵進行任何賦值操作。
解釋下標索引的機制
用下標訪問map中不存在的元素時,將導致向map中添加該下標所指向的新元素,其值會根據類型默認值或默認構造函數進行初始化(如int或初始化為0,string初始化為“”)。
(2)通過方法count()和find()查找
因此,如果判斷map中是否存在某鍵值的元素,一般不能通過取下標的方式判斷,因為這樣會想map中添加新元素。map標准庫中提供了兩種判斷某鍵值的元素是否存在的方法,count()方法和find()方法,如下表
map::count(k) | 返回map中鍵k出現的次數,這里只能取0(不存在)和1(存在) |
map::find(k) | 如果容器中存在按k的索引元素,則返回指向該元素的迭代器。如果不存在則返回超出末端的迭代器 |
這兩種方法不會向map中插入新元素,因此對map索引鍵判斷時,應選用這兩種方法。