轉載:https://blog.csdn.net/sendinn/article/details/96286849
最近在項目中用標准庫中的關聯性容器map,但知道map默認升序的,但在一個需求時又不想讓它排序,保持元素原始位置。原先查了資料發現,標注庫中有不排序的map,可以重寫map的第三個比較函數,但實際使用中發現,用了自定義的比較函數,map的find函數沒法用。
unordered_map:
包含頭文件 #include<unordered_map>
關聯性:std::unorederd_map 是一個關聯容器,其中的元素根據鍵來引用,而不是根據索引來引用。
無序性:在內部,std::unordered_map中的元素不會根據其鍵值或映射值按任何特定順序排序,而是根據其哈希值組織到桶中,以允許通過鍵值直接快速訪問各個元素(常量的平均時間復雜度)。
唯一性:std::unorederd_map中的元素的鍵是唯一的。
void testUnordermap() { std::unordered_map<std::string, int> unm; unm["d"] = 1; unm["c"] = 2; unm["b"] = 3; unm["a"] = 4; unm["a"] = 5; std::unordered_map<std::string, int>::iterator iter1 = unm.begin(); for (; iter1 != unm.end(); iter1++) { std::cout << "unordered_map: " << iter1->first.c_str() << std::endl; } unm["j"] = 1; }
運行結果:
map:
在網上查資料說,map容器有4個參數,其中影響自動排序的是第三個參數,只要保證為true即可。
上給出的多是直接返回true或是if (lhs == rhs) return false; return true;(加了相同的key則默認處理返回false的條件)
但是其實map如果想第三個參數返回true需要經過兩次比較,如果第一次返回true那么會把左右參數對調再判斷一次,這一次則要返回false,才能無序排列,所以要多加些條件。
#include <iostream> #include <unordered_map> #include <map> template<class T> struct DisableCompare : public std::binary_function<T,T,bool> { bool operator()(T lhs,T rhs)const { static bool disblecompare = false; if (lhs == rhs) { return false; } if (disblecompare) { disblecompare = false; return false; } else { disblecompare = true; return true; } } }; void test() { std::map<std::string, int, DisableCompare<std::string>> m; m["d"] = 1; m["c"] = 2; m["b"] = 3; m["a"] = 4; m["a"] = 5; std::map<std::string, int>::iterator iter = m.begin(); for (; iter != m.end();iter++) { std::cout << "map: " << iter->first.c_str() << std::endl; }
std::map<std::string, int>::iterator iter1 = m.find("d");
} int main() { test(); getchar(); return 0; }
如果只想不排序,不用find的話,可以采用這種方法,但實際需求,一般都會使用map的find函數,所以在此還需要想其他辦法。
也許不是這種特殊需求,我們只知道用map,並利用它的默認排序,知識的積累真是一點一滴的,沒有捷徑。