map中的元素是關鍵字-值對:關鍵字起到索引的做用,值表示與索引相關的數據。咱們經常使用的字典就是很好的map的實例,單詞做爲索引,其中文含義表明其值。map類型一般被稱爲關聯數組,其和數組很類似,只不過其下標不是整數而是關鍵算法
字,咱們經過關鍵字來查找值而不是位置。好比電話簿也是一個map的例子,姓名做爲關鍵字其對應的值就爲該人的電話號碼。map類型定義在頭文件map中。數組
注意:map是有序的且不容許重複關鍵字的關聯容器!其有序的實現是依靠關鍵字類型中的"<"來實現的。app
map<key_type,value_type> tempMap;//建立空map
map<key_type,value_type> tempMap{
{key1,value1},
{key2,value2},
......};
map<key_type,value_type> tempMap(existMap);//注意關鍵字類型與值類型匹配
map<key_type,value_type> tempMap(b,e);//b,e爲已有map對象的迭代器範圍
咱們能夠將一個已有的map賦值給另外一個map:函數
map1=map2;
map也支持列表賦值:spa
map<key_type,value_type> tempMap={ {key1,value1}, {key2,value2}, ......};
除了以前的容器操做具備的類型,map有本身獨特的類型別名:code
類型別名 | 說明對象 |
key_typeblog |
關鍵字類型 |
mapped_type索引 |
關鍵字關聯的類型 |
value_type編譯器 |
pair<const key_type,mapped_type> |
舉例
map<int ,string> myMap; myMap::value_type v1;//v1爲pair<const int ,string>類型
myMap::key_type v2;//v2爲int類型
myMap::mapped_type v3;//v3爲string類型
pair標準類型定義在頭文件utility中,一個pair保存兩個數據成員,pair是用來生成特定類型的模板,當建立一個pair對象時必需要提供兩個類型名,
pair<string string> A;//保存兩個string
pair<string ,size_t> B;//保存一個string,一個size_t
pair<int ,vector<int>> C;//保存一個int和vector<int>
上面的代碼都是執行了默認構造函數來對數據成員進行初始化,咱們也能夠初始化器:
pair<string,string> thePair{"Hello","World"};
pair的數據成員是public的,而且成員命名爲first和second,咱們能夠使用普通的成員訪問符「.」來進行訪問。
咱們能夠在pair上的操做以下:
操做 | 說明 |
pair<T1,T2> P; |
p的成員數據類型分別爲T1,T2,並執行默認初始化 |
pair<T1,T2> p(v1,v2); |
P的成員數據類型分別爲T1,T2,而且使用v1,v2分別初始化 |
pair<T1,T2> p={v1,v2}; |
等價於上式 |
make_pair(v1,v2); |
返回一個v1和v2初始化的pair,其類型由v1和v2推斷而來 |
p.first |
返回p的first成員 |
p.second |
返回p的second成員 |
p1 relop p2 |
執行關係運算(>,<,<=,>=),利用數據類型中的關係運算 |
p1==p2 |
相等性判斷,必須first和second同時知足要求 |
p1!=p2 |
不等於判斷 |
pair<int ,string> do_something(vecotr<string> &v) { if(!v.empty()) { return {v.back().size(),v.back()}; } else { return pair<int ,string>(); } }
有些較早版本的編譯器不支持花括號返回,那咱們能夠先構造pair對象再返回
pair<int ,string> do_something(vecotr<string> &v) { if(!v.empty()) { return pair<int ,string>(v.back().size(),v.back());//也可以使用make_pair來生成pair對象
} else { return pair<int ,string>(); } }
當咱們對map的迭代器進行解引用的時候咱們獲得的是value_type類型,也就是一個pair類型,要注意的是其first成員是const的,second成員是很是量成員,很明顯咱們不能改變map關鍵字,但咱們能夠改變關鍵字所關聯的值,咱們能夠使用迭代器來遍歷咱們的map對象
auto map_iter=myMap.cbegin(); while(map_iter!=myMap.cend()) { cout<<"key: "<<map_iter->first<<"value: "<<map_iter->second<<endl; ++map_iter; }
注意:因爲map中的關鍵字是const,咱們通常不對map使用泛型算法!
咱們使用insert對map進行元素添加操做,咱們必需要記住的一點就是map的元素是pair類型的,下面列舉經常使用的insert方法:
myMap.insert({k1,v1}); myMap.insert(make_pair(k2,v2)); myMap.insert(pair<key_type,value_type>(k3,v3)); myMap.insert(map<key_type,value_type>::value_type(k4,v4));
下面列舉其餘的一些添加元素的方式:
操做 | 說明 |
c.insert(v) | v爲value_type對象,返回一個pair包含一個迭代器和是否成功插入的bool值,關鍵詞不存在才插入 |
c.emplace(args) | args用來構造元素,返回一個pair包含一個迭代器和是否成功插入的bool值,關鍵詞不在才插入 |
c.insert(b,e) | b和e是迭代器,指定多個元素插入,返回void |
c.insert(il) | il花括號列表形式,返回void |
c.insert(p.v) | 和insert(v)相似,p是迭代器,指定從哪裏開始搜索新元素應該存儲的位置,返回值爲一個迭代器,指出具備給定關鍵字的元素 |
c.emplace(p,args) | 和c.emplace(args)相似,p是迭代器,指定從哪裏開始搜索新元素應該存儲的位置,返回值爲一個迭代器,指出具備給定關鍵字的元素 |
添加單一元素的insert和emplace返回值一個pair,告訴咱們插入是否成功,pair的first是一個迭代器,指向具備給定關鍵字的元素,second是一個bool型,若是插入成功爲true,不然爲false。若是關鍵字已經在map中那麼insert和emplace什麼也不作。
使用erase函數來執行map的刪除操做:
操做 | 說明 |
c.erase(k) | 刪除c中關鍵詞爲k的元素,返回值爲size_type類型,指出刪除元素的數目,由於map中不容許重複,返回值爲0或者1 |
c.erase(p) | 從c中刪除迭代器p指定的元素,p必須指向一個真實存在的元素,返回值指向p以後元素的迭代器,若是p指向c的微元素,那麼將返回c.end() |
c.erase(b,e) | 刪除迭代器對b和e所表示返回的元素,返回值迭代器e |
map提供了下標操做和at函數操做。咱們對map使用下標操做要注意下標是關鍵字,還要注意的是對不存在map中的關鍵字使用了下標操做,會添加一個具備該關鍵字的元素到map中。
操做 |
說明 |
c[k] | 返回關鍵字爲k的元素,若是k不在c中,添加一個關鍵字爲k的元素,對其進行初始化 |
c.at(k) | 訪問關鍵字爲k的元素,帶參數檢查,若是k不在c中,則返回out_of_range異常 |
當咱們對一個map進行下標操做的時候,會得到mapped_type對象,但當解引用map的迭代器時,會獲得一個value_type對象,若是關鍵字不存在map中,下標運算依然會添加一個具備該關鍵字的新元素。在咱們不肯定一個元素是否在map中,且不想在map中進行添加就不能使用下標操做。
當咱們要肯定一個元素是否存在map中,使用find是最佳的選擇,對於不容許重複關鍵字的map來講,使用count函數返回的關鍵字計數只能爲0和1。對於map元素的訪問還有以下的操做:
操做 | 說明 |
c.find(k) | 返回一個迭代器,指向第一個關鍵字爲k的元素,若是不在map中,則返回尾後迭代器c.end() |
c.count(k) | 返回關鍵字等於k的元素數量,對於map返回值只能爲0和1 |
c.lower_bound(k) | 返回一個迭代器,指向第一個關鍵字不小於k的元素 |
c.upper_bound(k) | 返回一個迭代器,指向第一個關鍵字大於k的元素 |
c.equal_range(k) | 返回一個迭代器pair,表示關鍵字等於k元素的範圍,若是k不存在,則pair的數據成員全是c.end() |
備註:若是使用lower_bound和upper_bound匹配關鍵字k,返回了相同的迭代器,那麼關鍵字k不在map中。