簡體   English   中英

如何在搜索中不使用std :: map的自定義比較功能(map :: find)?

[英]How not to use custom comparison function of std::map in searching ( map::find)?

如您在我的代碼中lenMaplenMap是帶有自定義比較功能std::map 此函數僅檢查字符串的長度。

現在,當我想搜索一些鍵(使用map::find )時,地圖仍然使用該自定義比較功能。

但是,當我搜索某些密鑰時,如何強制我的地圖不使用它

碼:

struct CompareByLength : public std::binary_function<string, string, bool>
{
    bool operator()(const string& lhs, const string& rhs) const
    {
        return lhs.length() < rhs.length();
    }
};

int main()
{
    typedef map<string, string, CompareByLength> lenMap;
    lenMap mymap;

    mymap["one"] = "one";
    mymap["a"] = "a";
    mymap["foobar"] = "foobar";

    // Now In mymap: [a, one, foobar]

    string target = "b";
    if (mymap.find(target) == mymap.end())
        cout << "Not Found :) !";
    else
        cout << "Found :( !"; // I don't want to reach here because of "a" item !

    return 0;
}

地圖本身不提供這種操作。 比較函子的想法是創建內部排序以加快查找速度,因此實際上根據您的函子對元素進行排序。

如果需要以其他方式搜索元素,則可以使用STL算法std::find_if() (具有線性時間復雜度),也可以創建使用另一個比較函子的第二張地圖。

在您的特定示例中,由於您似乎只對字符串的長度感興趣,因此應該使用長度(類型為std::size_t )而不是字符串本身作為鍵。

順便說一句,不需要std::binary_function作為基類。 從C ++ 11開始,甚至不再使用它,例如,請參見此處

比較功能告訴地圖如何排序元素以及如何區分元素。 如果僅比較長度,則具有相同長度的兩個不同字符串將占據映射中的相同位置(一個將覆蓋另一個)。

將您的字符串存儲在其他數據結構中並對其進行排序,或者嘗試使用此比較功能:

struct CompareByLength
{
    bool operator()(const string& lhs, const string& rhs) const
    {
        if (lhs.length() < rhs.length())
        {
            return true;
        }
        else if (rhs.length() < lhs.length())
        {
            return false;
        }
        else
        {
            return lhs < rhs;
        }
    }
};

我沒有進行測試,但是我相信這將首先按長度對字符串進行排序,然后通常將字符串進行比較。

您還可以使用std::map<std::string::size_type, std::map<std::string, std::string>>並將長度用於第一張地圖,並將字符串值用於第二張地圖。 您可能希望將其包裝在一個類中,以使其更易於使用,因為沒有防止將其弄亂的保護措施。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM