Map是STL的一個關聯容器,它提供一對一(其中第一個稱爲關鍵字,每一個關鍵字只能在map中出現一次,第二個稱爲該關鍵字的值)的數據處理能力。html
這裏說下map內部數據的組織,map內部自建一顆紅黑樹,這顆樹具備對數據自動排序的功能,因此在map內部全部的數據都是有序的。java
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
須要聲明頭文件,並使用命名空間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;
先不寫查詢,放在遍歷那裏一塊兒寫。
有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);
剛纔的移除元素已經用到了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的函數
這裏加上了我本身的理解和對知識的整理概括,參考原文連接:https://www.cnblogs.com/fnlingnzb-learner/p/5833051.html