C++(十二)— map的基本使用
標準庫map類型是一種以鍵-值(key-value)存儲的數據類型。
map是STL的一個關聯容器。它提供一對一(其中第一個可以稱為關鍵字,每個關鍵字只能在map中出現一次,第二個可能稱為該關鍵字的值)的數據 處理能力,由於這個特性,它完成有可能在我們處理一對一數據的時候,在編程上提供快速通道。這裏說下map內部數據的組織,map內部自建一顆紅黑樹(一 種非嚴格意義上的平衡二叉樹),這顆樹具有對數據自動排序的功能,所以在map內部所有的數據都是有序的。
1、map特點
map是一類關聯式容器。它的特點是增加和刪除節點對叠代器的影響很小,除了那個操作節點,對其他的節點都沒有什麽影響。對於叠代器來說,可以修改實值,而不能修改key
自動建立Key - value的對應。key 和 value可以是任意你需要的類型。
根據key值快速查找記錄,查找的復雜度基本是Log(N),如果有1000個記錄,最多查找10次,1,000,000個記錄,最多查找20次。
快速插入Key -Value 記錄。快速刪除記錄,根據Key 修改value記錄。遍歷所有記錄。
2、map對象的一些基本操作
因此,若只是查找該元素是否存在,可以使用函數count(k)
,該函數返回的是k出現的次數;若是想取得key對應的值,可以使用函數find(k)
,該函數返回的是指向該元素的叠代器。
第一種:用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置,由於map的特性,一對一的映射關系,就決定了count函數的返回值只有兩個,要麽是0,要麽是1,出現的情況,當然是返回1了
第二種:用find函數來定位數據出現位置,它返回的一個叠代器,當數據出現時,它返回數據所在位置的叠代器,如果map中沒有要查找的數據,它返回的叠代器等於end函數返回的叠代器。
查找map中是否包含某個關鍵字條目用find()方法,傳入的參數是要查找的key,在這裏需要提到的是begin()和end()兩個成員,分別代表map對象中第一個條目和最後一個條目,這兩個數據的類型是iterator.
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> #include<map> using namespace std; int main() { map<char, int> p; //map中插入元素 p.insert(make_pair(‘a‘,10)); p.insert(make_pair(‘c‘,9 )); p.insert(make_pair(‘b‘,10 )); //采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。 //p[‘y‘] = 17; //p[‘f‘] = 11; map<char, int>::iterator it; for (it = p.begin(); it != p.end(); it++) cout << (*it).first << " " << (*it).second << endl; /*用count函數來判定關鍵字是否出現,其缺點是無法定位數據出現位置, 由於map的特性,一對一的映射關系, 就決定了count函數的返回值只有兩個,要麽是0,要麽是1,出現的情況,當然是返回1了*/ if (p.count(‘b‘)) { //返回出現次數,0或者1. cout << p.count(‘b‘) << endl; } //用find函數來定位數據出現位置,它返回的一個叠代器 map<char, int>::iterator iter; iter = p.find(‘b‘); if (iter != p.end()) cout << "Find, the value is " << (*iter).second << endl; else cout << "Do not Find" << endl; system("pause"); return 0; }
刪除元素方法。
#include<iostream> #include<algorithm> #include<stdio.h> #include <vector> #include<string> #include<map> using namespace std; int main() { map<char, int> p; //map中插入元素 p.insert(make_pair(‘a‘,10)); p.insert(make_pair(‘c‘,9 )); p.insert(make_pair(‘b‘,10 )); //采用下標的方法讀取map中元素時,若map中不存在該元素,則會在map中插入。 //p[‘y‘] = 17; //p[‘f‘] = 11; map<char, int>::iterator it; for (it = p.begin(); it != p.end(); it++) cout << (*it).first << " " << (*it).second << endl; //如果你要演示輸出效果,請選擇以下的一種,你看到的效果會比較好 //如果要刪除1,用叠代器刪除 map<char, int>::iterator iter; iter = p.find(1); p.erase(iter); //如果要刪除1,用關鍵字刪除 int n = p.erase(1);//如果刪除了會返回1,否則返回0 //用叠代器,成片的刪除 一下代碼把整個map清空 p.erase(p.begin(), p.end()); //成片刪除要註意的是,也是STL的特性,刪除區間是一個前閉後開的集合 //自個加上遍歷代碼,打印輸出吧 system("pause"); return 0; }
C++(十二)— map的基本使用