acm的STL容器之Map篇

1.對map的簡單介紹

 Map是STL的一個關聯容器,它提供一對一(其中第一個稱爲關鍵字,每一個關鍵字只能在map中出現一次,第二個稱爲該關鍵字的值)的數據處理能力。html

這裏說下map內部數據的組織,map內部自建一顆紅黑樹,這顆樹具備對數據自動排序的功能,因此在map內部全部的數據都是有序的。java

2.map功能介紹

 map利用k-v,即Key - value。key 和 value能夠聲明成任意你須要的類型。ios

查找的複雜度基本是Log(N),若是有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。c++

map的經常使用操做:數組

快速插入Key -Value 記錄。函數

快速刪除記錄spa

根據Key 修改value記錄。code

遍歷全部記錄。htm

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   //若是不存在則返回end(),因此若是!end()就是存在(iter->First是輸出key,iter->second輸出value)
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就能夠了。

1 for(iter = mapStudent.begin(); iter != mapStudent.end(); iter++)  {
2   //第一種方法,直接使用iter 
3         cout<<iter->first<<' '<<iter->second<<endl;  
4   
5 }  
 1 int ismapSize = ismap.size();  
 2  //第二種方法,數組法
 3 //注意,這裏是 for(int i = 1; i <= ismapSize; i++)  
 4 //而不是 for(int i = 0; i < ismapSize; i++)  
 5   
 6     for(int i = 1; i <= ismapSize; i++){ 
 7   
 8         cout<<ismap[i]<<endl;  
 9   
10 }  

 

附上表:

  map的基本操做函數:

     C++ maps是一種關聯式容器,包含「關鍵字/值」對

     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的函數

 

 關於map有不少其餘操做,可是在比賽中不經常使用,因此在這裏不列舉

這裏加上了我本身的理解和對知識的整理概括,參考原文連接:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html

相關文章
相關標籤/搜索