map的基本介紹
我們常常把map稱之為映射,就是將一個元素(通常稱之為key鍵)與一個相對應的值(通常稱之為value)關聯起來,比如說一個學生的名字(key)有與之對應的成績(value),它們是一一對應的,就好像一把鑰匙開一扇門,在map中鍵是唯一的,也只有唯一的確定的值。
在C++中,map提供了以下三種數據結構,其底層實現以及優劣如下表所示:
(注意:map中鍵是唯一的,但是multimap則沒有此限制)
映射 | 底層實現 | 是否有序 | 數值是否可以重復 |
std::map | 紅黑樹 | key有序 | key不可重復 |
std::multimap | 紅黑樹 | key有序 | key可重復 |
std::unordered_map | 哈希表 | key無序 | key值不可重復 |
std::unordered_map的key值存儲是無序的,底層實現為哈希表,查找速度更快,如果不需要排序而只是快速查找鍵對應的值,可以考慮使用。
std::map和std::multimap的底層實現是紅黑樹,它的key值存儲是有序的,如果需要對鍵值對自定義排序,可以使用std::map。
map的使用
使用映射容器需要引入頭文件<unordered_map>或者<map>
//引入unordered_map頭文件,包含unordered_map類型
#include <unordered_map>
//引入map頭文件,包含map類型和multimap類型
#include <map>
想要聲明map映射關系,需要指定鍵的類型和值的類型。
//聲明一個整數類型映射到整數類型的 無序映射
unordered_map<int,int> uMap;
//聲明一個將字符串映射到整數的'map',可以這樣聲明
map<string,int>myMap;
想要插入鍵值對key-value,需要使用insert()函數或者使用[]操作符來插入。如果鍵不存在,[]操作符將會創建一個新的鍵值對,將其插入到map中,并將值初始化為默認值(對于整數來說,默認值為0)。
uMap[0]=10;
uMap[10]=0;uMap["math"]=100;
uMap["english"]=80;
和set類似,可以使用find函數來檢查某個鍵是否存在于map中,它會返回一個迭代器。如果鍵存在,迭代器指向該鍵值對,否則指向map的末尾。
if(myMap.find("math")!=myMap.end()){//鍵存在
}else{//鍵不存在
}
你可以使用范圍for循環來遍歷map中的所有的鍵值對,進行各種操作。
for(const pair<int,int>&kv:umap){
}
當使用范圍for循環遍歷map時,我們需要聲明一個變量kv來存儲每鍵值對,這個變量的類型通常是pair類型,下面就讓我們來詳細的解釋一下const pair<int,int>&kv:umap
const用于聲明一個不可修改的變量,這意味著一旦變量被初始化,就不能再修改其值。常量通常用大寫字母表示。
注:因為const聲明的變量一旦創建后就無法修改值,所以必須初始化。
const double PI=3.1415926;
在這里,const關鍵字表示你只能讀取容器中的元素,而不能修改他們。
而pair<int,int>定義了kv也就是鍵值對的數據類型是pair,C++中的pair類型會將兩個不同的值組合成一個單元,常用于存儲鍵值對,創建pair的時候,也必須提供兩個類型名,比如上面的pair對象,兩個值的類型都是int,在使用時通過first和second成員來訪問pair中的第一個和第二個元素,它的first成員存儲鍵,而second成員存儲值。
&:這個符號表示kv是一個引用(reference),而不是值的拷貝,如果不使用引用的話,那在每次循環迭代中都會重新創建一個新的pair對象來復制鍵值,而這會導致不必要的內存分配和拷貝操作。
代碼編寫
while(n--)
{//輸入key和doorcin>>key>>door;//將key和對應的door放進map中umap[key]=door;
}
設置一個flag,用來標志是否找到匹配的鍵值對
bool flag=true;
遍歷map,判斷當前鍵值對中的值是否等于輸入的值,如果等于,則將鍵輸出并退出
for(const pair<int,int>&kv:umap)
{//檢查當前鍵值對中的值是否等于xif(kv.second==x){cout<<kv.first<<endl;//如果找到了匹配的鍵值對,將kv.first輸出到標準輸出,并換行flag=false;break;}
}
因此,本題的源代碼是:
#include <iostream>
#include <unordered_map>using namespace std;int main()
{int s,n,key,door,x;cin>>s;while(s--){unordered_map<int,int> umap;cin>>n;while(n--){cin>>key>>door;umap[key]=door;}cin>>x;bool flag=true;for(const pair<int,int>&kv:umap){if(kv.second==x){cout<<kv.first<<endl;flag=false;}}if(flag){cout<<"Can't open the door."<<endl;}}
}