C 中unordered map的版本相容性問題

2021-08-01 08:39:13 字數 1511 閱讀 7251

在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 利用第一種訪...