acm的STL容器之Map篇
1.對map的簡單介紹
Map是STL的一個關聯容器,它提供一對一(其中第一個稱為關鍵字,每個關鍵字只能在map中出現一次,第二個稱為該關鍵字的值)的數據處理能力。
這裏說下map內部數據的組織,map內部自建一顆紅黑樹,這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的。
2.map功能介紹
map利用k-v,即Key - value。key 和 value可以聲明成任意你需要的類型。
查找的復雜度基本是Log(N),如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。
map的常用操作:
快速插入Key -Value 記錄。
快速刪除記錄
根據Key 修改value記錄。
遍歷所有記錄。
3.map的聲明
需要聲明頭文件,並使用命名空間std。
#include<iostream>
#include<map>
using namespace std;
聲明一個map。根據個人命名規範習慣,推薦int-int類型的map叫 iimap,如果是<int,string>類型的推薦叫 ismap
一半聲明了map後,為了以後查詢、遍歷、刪除等方便,我們順便聲明iterator
map<int,int> iimap;
map<int,int>::iterator iter;
4.數據的插入、刪除、數量、清空
先不寫查詢,放在遍歷那裏一起寫。
有2種方法可以向map中填入數據,第一種是用類似數組的方式。
ismap[1] = "hello";
這樣,字符串“hello”的key就是1.
還有一種是
iimap.insert(pair<int,int>(a,b));
(我這裏使用的第一個是<int,string>,第二個是<int,int>)
這兩種方式有區別,第一種數組的方法可以覆蓋重復key值的value,第二種插入時若key已經存在,則插入無效。
當然,第二種方法可以用pair來查詢數據是否插入成功(acm中通常不使用),這裏給代碼,不作詳解。
1 map<int, string> ismap; 2 3 pair<map<int, string>::iterator, bool> Insert_Pair; 4 5 Insert_Pair = ismap.insert(pair<int, string>(1, "hello")); 6 7 if(Insert_Pair.second == true) 8 9 cout<<"Insert Successfully"<<endl; 10 11 else 12 13 cout<<"Insert Failure"<<endl;
數據數量查詢(map中數據樣本多少)
iimap.size();
清空map的操作
iimap.clear();
從map中刪除特定元素
移除某個map中某個條目用erase()
該成員方法的定義如下:
iterator erase(iterator it);//通過一個條目對象刪除 iterator erase(iterator first,iterator last)//刪除一個範圍 size_type erase(const Key&key);//通過關鍵字刪除
剛才提到的clear()就相當於enumMap.erase(enumMap.begin(),enumMap.end());
這裏只演示刪除某key值和其對應的value
1 map<int, string>::iterator iter;
2 //第一種,通過iter刪除
3 iter = ismap.find(1);
4
5 ismap.erase(iter);
6
7 //第二種,直接在erase()的括號中填入key,可以不用n,只是刪除不管返回值
8 //這樣的話會有一個返回值,這裏用n來接收,刪除了會返回1,否則返回0
9 int n = ismap.erase(1);
5.數據的查詢和遍歷
剛才的移除元素已經用到了iterator,接下來我們都要用。通常用第二種方法。
查找一個元素是否存在的兩種方式:
第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置。
由於map的特性,一對一的映射關系,就決定了count函數的返回值只有兩個,要麽是0,要麽是1,出現的情況,當然是返回1了
由於比賽中用得比較少,大家自行體會,代碼就不放了。
第二種:用find函數來定位數據出現位置,它返回的一個叠代器,當數據出現時,它返回數據所在位置的叠代器,如果map中沒有要查找的數據,它返回的叠代器等於end函數返回的叠代器。
查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這裏需要提到的是begin()和end()兩個成員,
分別代表map對象中第一個條目和最後一個條目,這兩個數據的類型是iterator.
因為我們已經聲明過iterator了,所以就方便很多,直接用iter=ismap.find(index)來查找,然後使用一個if語句來判斷。
1 iter = ismap.find(1); 2 3 if(iter != ismap.end()) 4 5 cout<<"Find, the value is "<<iter->second<<endl; 6 7 else 8 9 cout<<"Do not Find"<<endl;
個人感覺c++的容器搞得沒java好,比較麻煩,好懷念containKey()這種操作。
接下來講遍歷,也是用iter就可以了。
(待完善)
acm的STL容器之Map篇