C++ std::map 屏蔽排序(沒法使用find函數)


轉載: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,並利用它的默認排序,知識的積累真是一點一滴的,沒有捷徑。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM