map是鍵-值對的集合。map類型通常可以理解為關聯數組:可以使用鍵作為下標獲取一個值,正如內置數組一樣。而關聯的本質在於元素的值於某個特定的鍵相關聯,而並非通過元素在數組中的位置獲取。
1.map對象的定義
要使用map對象,則必須包含map頭文件。在定義map對象時,必須分別指明鍵和值得類型
map<string,int> word_count;
string為鍵,int為值
map的構造函數
map<k,v> m; //創建一個名為m的空map對象,其鍵和值得類型分別為k和v
map<k,v> m(m2); //創建m2的副本m,m與m2必須有相同的鍵類型和值類型
map<k,v> m(b,e) //創建map類型的對象m,存儲迭代器b和e標記范圍內所有元素的副本。元素的類型必須能轉換為pair<const k,v>。
2.map定義的類型
map<k,v>::key_type 在map容器中用作索引的鍵的類型
map<k,v>::maped_type 在map容器中,鍵所關聯的值得類型
map<k,v>::value_type 一個pair類型,它的first元素具有const map<k,v>::key_type類型,而second元素則為map<k,v>::maped_type類型。
對map迭代器進行解引用將獲得一個pair對象,它的first成員存放鍵,為const,而second成員則存放值。
3.給map添加元素
與其他下標操作符一樣,map的下標也是使用索引獲取該鍵關聯的值。如果該鍵在容器中,則map的下標運算與vector的下標元素一樣:返回該鍵所關聯的值。只有在所查的鍵不存在是,map容器才為該鍵創建一個新的元素,並將它插入到此map對象中。此時,所關聯的值采用值初始化:類類型的元素用默認的構造函數初始化,而內置類型的元素則初始化為0。
map容器提供的insert操作
m.insert(e) e是在m上的value_type類型的值。如果鍵(e.first)不在m中,則插入一個e.second的新元素;如果該鍵在m中已經存在,則保持m不變。該函數返回一個pair類型對象,包含指向鍵為e.first的元素的map迭代器,以及一個bool類型的對象,表示是否插入了該元素
m.insert(beg,end) 迭代器之間的元素必須為value_type類型的鍵-值對。在該范圍內的元素,如果不在m中,則插入。
m.insert(iter,e) 從迭代器iter開始尋找,不存在m中則插入,返回迭代器,指向m中具有指定鍵的元素
word_count.insert(map<string,int>::value_type("Anna",1));
也可以簡化為 word_count(make_pair("Anna",1));
使用第一種方法插入返回的是pair類型。
pair<map<string,int>::iterator,bool> ret=word_count.insert(map<string,int>::value_type("Anna",1));
4.查找並獲取map中的元素
使用下標獲取map中國的值,如果該鍵不存在,則插入了顯得元素。下面map提供了兩個操作
m.count(k) 返回m中k出現的次數
m.find(k) 存在則返回指向該元素的迭代器,否則返回超出末端迭代器
對於map,count的返回值只可能是0或者1,通過該函數就可以知道是否存在,然後使用下標操作,則不會出現不存在則插入新元素的問題。
對於find函數,通過判斷是否與超過末端的迭代器相等判斷是否存在,若存在則使用返回的迭代器,該返回的迭代器是pair類型,通過下面的方法獲得值int value=iter->second;
5.從map中刪除元素
m.erase(k) 刪除m中鍵為k的元素。返回size_type類型的值,表示刪除元素的個數
m.erase(p) 從m中刪除迭代器p所指向的元素。p必須指向m中確實存在的元素,而且不能等於m.end()。返回void類型
m.erase(b,e) 從m中刪除一段范圍內的元素,該范圍由迭代器對b和e標記。b和e必須標記m中一段有效范圍:即b和e都必須指向m中的元素或者最後一個元素的下一個位置。而且b和e要麼相等(此時刪除的范圍為空),要麼b指向的元素必須出現在e所指向的元素之前。返回void類型。
除此之外,map還提供一種特殊的erase操作,其參數是key_type類型的值,如果擁有該元素的鍵存在,則刪除該元素,返回刪除的個數。對於map來說,返回值為1或者0。0表示表示刪除的元素在map中不存在。
對於map對象的遍歷,可以使用迭代器,m.end()和m.begin()。