unordered_map和map類似,都是存儲的key-value的值,可以通過key快速索引到value。不同的是unordered_map不會根據key的大小進行排序,
存儲時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的,而map中的元素是按照二叉搜索樹存儲,進行中序遍歷會得到有序遍歷。
所以使用時map的key需要定義operator<。而unordered_map需要定義hash_value函數並且重載operator==。但是很多系統內置的數據類型都自帶這些,
那么如果是自定義類型,那么就需要自己重載operator<或者hash_value()了。
結論:如果需要內部元素自動排序,使用map,不需要排序使用unordered_map
unordered_map可類比於Python中的字典。其實現使用了哈希表,可以以O(1)的時間復雜度訪問到對應元素,但缺點是有較高的額外空間復雜度。與之對應,STL中的map對應的數據結構是紅黑樹,紅黑樹內的數據時有序的,在紅黑樹上查找的時間復雜度是O(logN),相對於unordered_map的查詢速度有所下降,但額外空間開銷減小。
unordered_map常用函數
需要包含的文件
#include <unordered_map>
using namespace std;聲明一個unordered_map
在< >中需要指明兩個變量類型,類比Python的字典,第一個是key的類型,第二個是key對應的value的類型
unordered_map<char, int> map;插入鍵值對的方法,下面介紹兩種方法
首先是使用[]的方法map['A'] = 1;在Python中,如果事先聲明了一個字典,也可以用這種方法增加(key, value)對
## Python字典示例
dic = {} # 聲明一個字典
dic['A'] = 1 # 增加鍵值對此外也可以用insert函數插入鍵值對。map.insert(make_pair('A', 1)); //這其中用到了std中的另外一個函數make_pair
判斷所有key中是否包含某key
首先是使用iterator來判斷的方法。假設我們要檢驗 'B' 是否在我們剛剛聲明的map中,可以用unordered_map的成員函數:find()函數和end()函數。注意這里find()和end()所返回的數據類型均為iterator。在unordered_map中,如果find()沒找到要找的key,就返回和end()一樣的iterator值。
if(map.find('B') == map.end()) { //此時'B'不存在於map的鍵(key)中
// do something
}
其次也可以用count()函數。count()返回要查找的key在map的所有key種的出現次數。因為此容器不允許重復,故count()只可能返回 1 或 0,即可判斷此key是否存在。
if(map.count('B') == 0) { //此時'B'不存在於map的鍵(key)中
// do something
}
移除元素
移除元素可以用erase()函數來完成,有三種形式:
iterator erase( const_iterator pos );
iterator erase( const_iterator first, const_iterator last );
size_type erase( const key_type& key );前兩者使用迭代器指明移除范圍,第三個移除特定key的鍵值對。
示例程序:(摘自cppreference.com)
#include <unordered_map>
#include <iostream>
int main()
{
std::unordered_map<int, std::string> c = {{1, "one"}, {2, "two"}, {3, "three"},
{4, "four"}, {5, "five"}, {6, "six"}};
// 從 c 擦除所有奇數
for(auto it = c.begin(); it != c.end(); ) //使用std::unordered_map<int,std::string>::iterator來表明
if(it->first % 2 == 1) //it的類型未免太冗長,因此用auto
it = c.erase(it);
else
++it;
for(auto& p : c) //for each 類型的loop
std::cout << p.second << ' '; //當使用iterator時,iterator的first指向key,second指向value
}
---------------------
參考文獻:
https://blog.csdn.net/a690938218/article/details/79162529?utm_source=copy
https://www.cnblogs.com/muziyun1992/p/6829051.html