1、綜述
Map是C++STL中眾多的Container(容器)之一,與python的字典略類似,Map作為一個關聯容器,將key與value相互關聯,其中key為關鍵字,是不可更改的,而value是key值的相對應值。Map所提供的一對一的資料對應關係,在很多時候可以提供編程的極大便利。
Map內部通過自建紅/黑樹狀結構(一種非嚴格意義上的平衡二叉樹)實現,可以對資料自動排序,因而在map內部的所有資料是有序存放的。Map具有的一大特點是增加和刪除節點對迭代器的影響很小,除了那個動作節點,對其他的節點都沒有什麼影響。
Map具有如下的功能特點: 自動建立Key - value的對應。key 和 value可以是任意你需要的類型。 根據key值快速尋找記錄,尋找的複雜度基本是Log(N),如果有1000個記錄,最多尋找10次,1,000,000個記錄,最多尋找20次。 快速插入Key - Value 記錄。 快速刪除記錄 根據Key 修改value記錄。 遍曆所有記錄。
2、map的常見操作
首先,在使用map之前需包含標頭檔#include<map>,下面簡要介紹map的常見操作,詳細資料可參見http://www.cplusplus.com/reference/map/map/。
(1)建構函式:
map<int,string> Mymap; map<int,string> Mymap2 (Mymap.begin(),Mymap.end());map<int,string> Mymap3 (Mymap2);
樣本中int是key的類型,string是value的類型,可以為其他類型,如map<char,float> Mymap4;
(2)插入資料:有幾種方式,下面舉三類例子。
Mymap[1] = "one"; //方式1Mymap.insert(map<int,string>::value_type(11,"oneone"));//方式2Mymap.insert(pair<int ,string>(111,"oneoneone"));//方式3
其中方式1簡單直觀,然而卻並不值得提倡,因其效能並不好。在插入key = 1的value=“one”時,需要首先在Mymap,尋找主鍵1是否已經存在,若不存在, 則將一個新的對象插入Mymap,其key為1,但value是一個Null 字元串,插入完成後,將value賦為"one"; 該方法會首先將每個值都賦為預設值,然後再賦為顯示的值,如果元素是類對象,則開銷比較大。而另外的方法則有效避免了這一問題。
(3)尋找元素:
利用find()方法,find()函數返回一個迭代器指向索引值為key的元素,如果沒找到就返回指向map尾部的迭代器。
map<int ,string>::iterator itr;itr = Mymap.find(1);if(itr!=Mymap.end())//如找不到,返回Mymap.end(){cout<<"找到key為1的項:"<<endl;cout<< itr->first <<" "<<itr->second<<endl;//可以列印該項的key和value}elsecout<<"找不到key為1的項。"<<endl;
(4)刪除元素:
採用erase()方法實現:
itr = Mymap.find(1);if(itr!=Mymap.end()){Mymap.erase(itr);//通過迭代器對象刪除//Mymap.erase(1);//也可以通過主鍵刪除}
erase()也可以刪除一個範圍如:
Mymap.erase(Mymap.begin(),Mymap.end());//相當於Mymap.clear(),可以清除整個map的內容
(5)swap()方法:
要注意的是,在map中swap()方法進行的是對於兩個map的交換,而非對map內兩個元素的交換。形如:
Mymap.swap(Mymap2);//交換兩個map
(6)size()方法:
返回map的大小,即元素的個數。
(7)empty()方法
判斷map是否為空白,若map為空白,則返回true。
(8)begin()方法:
返回指向map頭部的迭代器
(9)end()方法:
返回指向map尾部的迭代器
(10)count() 方法:
返回指定元素出現的次數
3、常見操作程式執行個體
貼上一個簡單的程式集運行結果,以便於更好的理解。
//測試map用法#include<map>#include<string>#include<iostream>using namespace std;void test_map(){map<int ,string > Mymap;//key為int型,value為string型map<int ,string > Mymap2;pair<int ,string> Mypair;Mypair.first = 1;Mypair.second = "one";Mymap.insert(Mypair);//添加資料方式1Mymap.insert(map<int,string>::value_type(11,"oneone"));//添加資料方式二Mymap2[2] = "two"; //添加資料方法三,效率較差,不提倡Mymap2[22] = "twotwo";Mymap2.insert(pair<int ,string>(222,"twotwotwo"));map<int ,string>::iterator itr;//迭代器cout<<"Mymap中的內容為:"<<endl;for(itr = Mymap.begin();itr!=Mymap.end();itr++)//元素遍曆{cout<< itr->first <<" " << itr->second<<endl;}cout<<"Mymap2中的內容為:"<<endl;for(itr = Mymap2.begin();itr!=Mymap2.end();itr++){cout<< itr->first <<" " << itr->second<<endl;}/////元素尋找itr = Mymap.find(11);//尋找map中某key對應的元素是否存在if(itr!=Mymap.end())//如找不到,返回Mymap.end(){cout<<"\n找到key為11的項:"<<endl;cout<< itr->first <<" "<<itr->second<<endl;itr->second = "oneoneone";cout<<"該項value修改為:"<<Mymap[11]<<endl;}Mymap.swap(Mymap2);//注意:交換的是兩個mapcout<<"\n執行交換後:"<<endl;cout<<"Mymap中的內容為:"<<endl;for(itr = Mymap.begin();itr!=Mymap.end();itr++){cout<< itr->first <<" " << itr->second<<endl;}cout<<"Mymap2中的內容為:"<<endl;for(itr = Mymap2.begin();itr!=Mymap2.end();itr++){cout<< itr->first <<" " << itr->second<<endl;}cout<<"\n刪除Mymap2中key為1的項"<<endl;itr = Mymap2.find(1);if(itr!=Mymap2.end()){Mymap2.erase(itr);////Mymap2.erase(1);//按key刪除,以上面的操作效果等效}cout<<"刪除後Mymap2中的內容為:"<<endl;for(itr = Mymap2.begin();itr!=Mymap2.end();itr++){cout<< itr->first <<" " << itr->second<<endl;}if(!Mymap.empty()){cout<<"\nMymap大小為:"<<Mymap.size()<<endl;Mymap.clear();//Mymap.erase(Mymap.begin(),Mymap.end());//與clear()等效cout<<"clear()之後Mymap大小為:"<<Mymap.size()<<endl;}}