Map是STL的一個關聯容器,它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個稱為該關鍵字的值)的資料 處理能力。
需要的庫
#include <map>
基本操作
定義
map<string,int>m;
這是定義了一個以string為關鍵字,以int為值的map
插入
方法1:
map<string,int>m; m["Bob"]=101; m["Alice"]=102; m["Eric"]=103;
方法2:
m.insert(pair<string,int>("Lee",104));
方法3:
m.insert(map<string,int>::value_type("Karen",105));
遍歷
定義一個迭代指標iter,使其指向map,實現對map的遍歷。
#include<bits/stdc++.h> using namespace std; int main() { map<string,int>m; m["Bob"]=101; m["Alice"]=102; m["Eric"]=103; map<string,int>::iterator iter; for(iter=m.begin(); iter!=m.end(); iter++) cout<<iter->first <<"->"<<iter->second<<endl; }
輸出為:
Alice->102 Bob->101 Eric->103
可以看到map自動在內部以關鍵字為準,按字典序排序,而不是根據輸入的順序;
需要注意的是 當我進行實驗的時候 我發現這樣一個現象:
#include<bits/stdc++.h> using namespace std; int main() { map<string,int>m; m["Bob"]=101; m["Alice"]=102; m["Eric"]=103; map<string,int>::iterator iter; for(iter=m.begin(); iter!=m.end(); iter++) cout<<iter->first <<"->"<<iter->second<<endl; if(m["AAA"]==0) cout<<"NO"<<endl; for(iter=m.begin(); iter!=m.end(); iter++) cout<<iter->first <<"->"<<iter->second<<endl; }
當詢問一個map中不存在的數的時候,返回的值應該是0,不過當你再次遍歷的時候,就會發現map中已經多了一個鍵值對,只不過值是0:
Alice->102 Bob->101 Eric->103 NO AAA->0 Alice->102 Bob->101 Eric->103
在做題時一定要好好注意。
查詢
方法1:
cout<<m.find("Bob")->second<<endl;
如果按關鍵字搜尋,搜不到的話會輸出亂碼
方法2:
map<string,int>::iterator iter1; iter1 = m.find(string("Bob")); if(iter1 != m.end()) cout<<iter1->first <<"->"<<iter1->second<<endl; else cout<<"no fount"<<endl;
定義一個指標,指向map,如果沒有的話會返回m.end()
刪除
方法1
m.erase(iter1);
同樣的是指標的操作
方法2
m.erase(string("AAA"));
或者是根據關鍵字刪除
map的相關函式
- begin() 返回指向map頭部的迭代器
- clear() 刪除所有元素
- count() 返回指定元素出現的次數
- empty() 如果map為空則返回true
- end() 返回指向map末尾的迭代器
- equal_range() 返回特殊條目的迭代器對
- erase() 刪除一個元素
- find() 查詢一個元素
- get_allocator() 返回map的配置器
- insert() 插入元素
- key_comp() 返回比較元素key的函式
- lower_bound() 返回鍵值>=給定元素的第一個位置
- max_size() 返回可以容納的最大元素個數
- rbegin() 返回一個指向map尾部的逆向迭代器
- rend() 返回一個指向map頭部的逆向迭代器
- size() 返回map中元素的個數
- swap() 交換兩個map
- upper_bound() 返回鍵值>給定元素的第一個位置
- value_comp() 返回比較元素value的函式