1. 程式人生 > >acm的STL容器之Map篇

acm的STL容器之Map篇

刪除記錄 namespace 內部數據 比賽 簡單 find函數 元素 second 處理

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篇