在c++中最讓我蛋疼的事情之一就是unordered_map
千呼萬喚才出來,在c++早期版本標準庫裡面只有map
這個字典。 但是map
的內部實現是採用的紅黑樹,眾所周知,對於字典這類結構也可以用hash表來實現,也就是c++的標準庫應該也要有hash_map
這種資料結構。
在c++中關於map的hash表方法的實現是unordered_map
這個資料結構,首次出現應該是在c++98
那個年代的tr1
這個命名空間裡面出現。 使用方法寫起來比較囉嗦。
#include
using
std::tr1
::unordered_map
;
我認為像unordered_map
這個資料結構差不多就是c++程式設計師的柴公尺油鹽,生活必需品。 但是由於c++標準委員會的懶散,硬生生是拖到c++0x/c++11
標準才把unordered_map
納入std標準。 也就是只有在支援-std=c++0x
甚至-std=c++11
的編譯器裡(對於g++來說大概是g++4.4
這個版本以上的才開始支援),才可以用如下**使用unordered_map
:
#include
using
std::unordered_map
;
假設如果全世界所有的g++都已經是4.4版本以上了,那使用unordered_map
就不再有任何問題,但是現實是殘酷的,總會在世界某些角落的伺服器, 仍然在使用g++-4.1.x
,而且對於這些伺服器來說公升級g++還麻煩得很。所有我們的程式就要考慮對於低階版本的相容。
#if(__cplusplus == 201103l)
#include
#include
#else
#include
#include
namespace
std#endif
這個解決方法主要是依靠__cplusplus
這個巨集在不同c++版本中的值不同。 對於(能夠使用且)使用了-std=c++0x
或者-std=c++11
編譯選項的編譯過程,__cplusplus
的值是201103l
,否則則是其他值。
上述方法最低大概只能支援到c++98這個標準了,因為到了c++98才開始有tr1/unordered_map
,所以你的編譯器如果連c++98
都不支援的話,那就乖乖用遠古時代流傳至今的map
吧。
C 中unordered map的用法
c 使用unordered map include 在unordered map之前加上tr1庫名,using namespace std tr1 與此同時需要加上命名空間 查詢元素是否存在 若有unordered map mp 查詢x是否在map中 方法1 若存在 mp.find x mp.end...
C 中map和unordered map的用法
map和unordered map都是c 中可以充當字典 key value 來用的資料型別,但是其基本實現是不一樣的。對於map的底層原理,是通過紅黑樹 一種非嚴格意義上的平衡二叉樹 來實現的,因此map內部所有的資料都是有序的,map的查詢 插入 刪除操作的時間複雜度都是o logn 此外,ma...
C 中unordered map幾種按鍵查詢比較
unorder map有3種常見按鍵查值方法。使用標頭檔案和,以及命名空間std。第一種是按鍵訪問。如果鍵存在,則返回鍵對應的值 如果鍵不存在,則返回0 1 include2 include3 4using namespace std 56 intmain 1314 15016 117 利用第一種訪...