一、頭文件
#include "map"
#include "unordered_map"
二、原理
map內部是用紅黑樹(不嚴格平衡的二叉排序樹)實現的,能夠根據插入鍵值的不同進行自動排序,中序遍歷該樹即可得到從小到大遞增的鍵值。
unordered_map內部是用哈希表實現,通過特殊的函數把Key值映射到哈希表中的一個位置來訪問記錄,查找時間複雜度可達到O(1)。
因此,map適用於有序的問題,unordered_map適用於查找的問題。
三、用法
map與unordered_map相同,只需將下面的map換成unordered_map即可。
1、初始化
map<int, char> myMap;
map<int, char> myMap = {
{ 1, 'a' },
{ 2, 'b' },
{ 3, 'c' } };
2、插入
//直接通過數組方式插入
myMap[10]='y';
// 插入單個鍵值對
myMap.insert(pair<int, char>(6, 'h'));
//在指定位置插入,效率更高,不需要排列
myMap.insert(myMap.begin()+3, pair<int, char>(101, 't'));
// 多個鍵值插入
myMap.insert({ {100, 'i'}, {200, 'q'} });
//範圍多鍵值插入
map<int,char> secondMap;
secondMap.insert(myMap.begin(), myMap.end());
3、取值
//數組方式取值,若不存在該鍵值,得到空
myMap[100];
//at會下標檢查,若不存在該鍵值會被報錯
myMap.at(20);
4、判空
//空返回true 非空返回false
myMap.empty();
5、容量
int length = myMap.size();
6、刪除
//erase(const key_type& key) 通過參數Key來進行刪除
myMap.erase(1);
//刪除迭代器位置的鍵值對,並返回指向下一元素的迭代器
myMap.erase(myMap.begin());
// 刪除一定範圍內的元素,並返回一個指向下一元素的迭代器
// 注意:map的迭代器不允許使用+n運算,但可以++
mymap.erase(mymap.begin(), ++mymap.begin());
7、清空
myMap.clear();
8、交換
//交換兩個map的內容
map<int,char> secondMap = {5,'t'};
secondMap.swap(myMap);
9、順序比較
//比較兩個關鍵字在map中位置的先後,第一個key在前就返回1,否則0
mymap.insert(std::pair<int, char>(2, 'a'));
mymap.insert(std::pair<int, char>(1, 'b'));
//該用例返回1,因爲map是有序的紅黑樹,即使是先插入2,再插入1
std::map<int, char>::key_compare mycomp = mymap.key_comp();
int res = mycomp(1, 2);
cout << res;
10、查找
//關鍵字查詢,找到返回指向該關鍵字的迭代器,否則返回指向end的迭代器
map<int,char>::iterator it = myMap.find(1);
if(it != myMap.end())//存在該鍵值
cout << it->second;
11、迭代器
//迭代器有八種 begin、end、rbegin、rend和對應的const型 cbegin、cend、crbegin、crend
myMap.begin();//map的第一個鍵值對
myMap.rbegin();//map的最後一個鍵值對
12、遍歷
//通過迭代器的first得到key值,second得到value值
//正序遍歷
for(map<char,int>::iterator it = myMap.begin();it!=myMap.end();it++)
cout << "key:" << it->first << " value:" << it->second << endl;
//逆序遍歷
for (map<int, char>::reverse_iterator it = mymap.rbegin(); it != mymap.rend(); it++)
cout << "key:" << it->first << " value:" << it->second << endl;
參考:https://blog.csdn.net/shuzfan/article/details/53115922#%E4%B8%80-%E5%A3%B0%E6%98%8E