C++ unordered_map

unordered_map和map相似,都是存儲的key-value的值,能夠經過key快速索引到value。不一樣的是unordered_map不會根據key的大小進行排序,html

存儲時是根據key的hash值判斷元素是否相同,即unordered_map內部元素是無序的,而map中的元素是按照二叉搜索樹存儲,進行中序遍歷會獲得有序遍歷。ios

因此使用時map的key須要定義operator<。而unordered_map須要定義hash_value函數而且重載operator==。可是不少系統內置的數據類型都自帶這些,數據結構

那麼若是是自定義類型,那麼就須要本身重載operator<或者hash_value()了。函數

結論:若是須要內部元素自動排序,使用map,不須要排序使用unordered_mapoop

 

unordered_map可類比於Python中的字典。其實現使用了哈希表,能夠以O(1)的時間複雜度訪問到對應元素,但缺點是有較高的額外空間複雜度。與之對應,STL中的map對應的數據結構是紅黑樹,紅黑樹內的數據時有序的,在紅黑樹上查找的時間複雜度是O(logN),相對於unordered_map的查詢速度有所降低,但額外空間開銷減少。spa

 

 

unordered_map經常使用函數
須要包含的文件.net

#include <unordered_map>
using namespace std;聲明一個unordered_map
在< >中須要指明兩個變量類型,類比Python的字典,第一個是key的類型,第二個是key對應的value的類型htm


unordered_map<char, int> map;插入鍵值對的方法,下面介紹兩種方法
首先是使用[]的方法map['A'] = 1;在Python中,若是事先聲明瞭一個字典,也能夠用這種方法增長(key, value)對blog


## 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

相關文章
相關標籤/搜索