map是鍵-值對的集合,可以理解為關聯數組,可以使用鍵作為下標來獲取一個值
本文地址:http://www.cnblogs.com/archimedes/p/cpp-map.html,轉載請注明源地址。
使用前添加map頭文件,必須分別指明鍵和值的類型:
map<string,int>word_count;
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類型的對象,存儲迭代器b和e標記的范圍內所有元素的副本,元素的類型必須能轉化為pair<const k,v>
map對象的元素是鍵-值對,map的value_type反映了這樣的事實,value_type是存儲元素的鍵以及值的pair類型,而且鍵為const,比如word_count的類型為:
pair<const string, int>類型
map類定義的類型:
map<K,V>::key_type 在map容器中,用作索引的鍵的類型
map<K,V>::mapped_type 在map容器中,鍵所關聯的值的類型
map<K,V>::value_type 一個pair類型,它的first元素具有const map<K,V>::key_type類型,而second元素則為map<K,V>::mapped_type類型
map迭代器進行解引用將產生pair類型的對象
map<string,int>::iterator map_it=word_count.begin(); cout<<map_it->first; cout<<" "<<map_it->second; map_it->first="new key" //error ++map_it->second
使用insert成員實現或者先用下標操作符獲取元素,然後給獲取的元素賦值
使用下標訪問map對象
map<string,int>woed_count; //空map word_count["Anna"]=1; //插入默認的初始元素(鍵:Anna, 值:1)
map的下標也使用索引(就是鍵)來獲取該鍵所關聯的值,如果該鍵已在容器中,則map的下標運算行為相同,返回該鍵所關聯的值。只有在所查找的鍵不存在的時候,map容器才為該鍵創建一個新的元素,並將它插入到此map對象中。
1、下標操作符返回值的使用
下標操作符返回的是左值,即使特定鍵所關聯的值
cout<<word_count["Anna"]; ++word_count["Anna"]; count<<word_count["Anna"];
2、下標行為的編程意義
如果下標所表示的鍵在容器中不在,則添加新元素,這一特性可使程序驚人的簡練:
map<string, int>word_count; string word; while(cin>>word) ++word_count[word];
這段程序用來記錄每個單詞出現的次數
編程練習:編寫程序統計並輸出所讀入的單詞出現的次數
#include<iostream> #include<string> #include<vector> #include<map> #include<utility> using namespace std; int main() { map<string, int> word_count; string word; while(cin>>word) ++word_count[word]; map<string, int>::iterator it; for(it=word_count.begin(); it!=word_count.end(); it++) cout<<it->first<<":"<<it->second<<endl; return 0; }
插入單個元素的insert版本使用鍵-值pair類型的參數,對於參數為一對迭代器的版本,迭代器必須指向鍵-值pair類型的元素
map容器的接受單個值的insert版本的返回類型
使用下標給map添加新元素,元素的值部分將采用值初始化,而插入元素的另一個方法是:直接使用insert成員,語法更緊湊:
word_count.insert(map<string,int>::value_type("Anna",1));
傳遞給insert的實參相當的笨拙,可以用兩種方法簡化:
使用make_pair
word_count.insert(make_pair("Anna",1));
或使用typedef:
typedef map<string, int>::value_type valtype; word_count.insert(valtype("Anna", 1))
檢測insert的返回值
如果試圖插入的元素所對應的鍵已經在容器中,則insert將不做任何操作,但是帶有一個鍵-值pair形參的insert版本將返回一個值:包含一個迭代器和一個bool值的pair對象,其中迭代器指向map中具有相應鍵的元素,而bool值則表示是否插入了該元素
下面使用insert重寫的單詞統計程序:
#include<iostream> #include<string> #include<vector> #include<map> #include<utility> using namespace std; int main() { map<string, int> word_count; string word; while(cin>>word) { pair<map<string, int>::iterator, bool> ret=word_count.insert(make_pair(word,1)); if(!ret.second) ++ret.first->second; } map<string, int>::iterator it; for(it=word_count.begin(); it!=word_count.end(); it++) cout<<it->first<<":"<<it->second<<endl; return 0; }
下標操作符讀取一個值會產生副作用,map容器提供了兩個操作:count和find,用於檢查某個鍵是否存在而不會插入該鍵
m.count(k) 返回m中k的出現次數
m.find(k) 如果m容器中存在按k索引的元素,則返回指向該元素的迭代器。如果不存在,則返回超出末端迭代器
1、使用count檢查map對象中某鍵是否存在
對於map對象,count成員的返回值只能是0或1,map容器只允許一個鍵對應一個實例,所有count可有效地表明一個鍵是否存在
map<string, int> word_count; int occurs=0; if(word_count.count("foo")) occurs=word_count["foo"];
2、讀取元素而又不插入該元素
find操作返回指向元素的迭代器,如果元素不存在,則返回end迭代器
map<string, int> word_count; int occurs=0; map<string,int>::iterator it=word_count.find("foo");; if(it!=word_count.end()) occurs=it->second;