2013-05-14 111 views
2

我遇到了問題std::map。 我使用它特定的索引下圖對一些列表:std :: map - 如何更改鍵排序?

map<string, list<pair<string, int> > > List; 

它在Dijkstra算法中使用。 的主要問題是,地圖按字母順序排序string鍵,這樣的:

AAA, AA0, AA1, AAB, AC1 = AA0->AA1->AAA->AAB->AC1 

但我想給它以不同的方式進行排序:

AAA, AA0, AA1, AAB, AC1 = AAA->AAB->AA0->AA1->AC1 

有什麼解決辦法嗎?我讀了關於做自己的比較類,但我不知道如何做到這一點。或者也許有其他方法可以解決它?

回答

7

您必須提供您自己的比較函數,在實例化地圖時必須將其作爲第三個模板參數傳遞。例如:

struct Comp 
{ 
    bool operator()(const std::string& lhs, const std::string& rhs) const 
    { 
    // implement your comparison logic here 
    } 
}; 

這個類的實例是可調用(因此「函子」)的兩個字符串參數,並且基於在一個strict weak ordering邏輯應該返回真或假。

然後實例使用仿函數類型的地圖:

std::map<string, list<pair<string, int>>, Comp> List; 

現在的地圖將在內部使用的比較邏輯來定義其元素的順序。

+0

好的,我明白了,但是我怎樣才能比較字符串的差異?我的意思是,如何在字符串內找到一個數字? – 2013-05-14 14:10:21

+2

@ user2342783這是一個完全不同的問題。你應該問一個新問題 – stefan 2013-05-14 14:13:12

+0

@ user2342783這是一個不同的問題。但是你可以遍歷一個字符串的元素(每個字符都是'char'),並執行諸如call [std :: isdigit](http://en.cppreference.com/w/cpp/string/byte/isdigit)。 – juanchopanza 2013-05-14 14:13:12

-2

是的。您需要提供第三個模板參數,請參閱docs

+5

儘管您的陳述是正確的,但它本身並無幫助。至少要像其他人一樣寫下一個簡單的例子。另外,cplusplus.com不是_the docs_。 – stefan 2013-05-14 14:12:38

2

你必須寫你自己的比較器:

struct custom_string_comparer 
{ 
    bool operator()(const std::string& s1, const std::string& s2) 
    { 
     return ...; // your comparison here 
    } 
}; 

map<string, list<pair<string, int>>, custom_string_comparer> List; 
2

像其他人說的,你需要實現一個自定義比較...

struct custom_comparer 
{ 
    bool operator()(const std::string& left, const std::string& right) const 
    { 
     return std::lexicographical_compare(
      left.cbegin(), left.cend(), 
      right.cbegin(), right.cend(), 
      [](char l, char r) -> bool 
      { 
       bool ldigit = isdigit(l) != 0, 
         rdigit = isdigit(r) != 0; 

       return (!ldigit && rdigit) || (ldigit == rdigit && l < r); 
      }); 
    } 
}; 

而且使用它...

std::map<string, list<pair<string, int>>, custom_comparer> List; 

正常string比較運算符使用lexicographical_compare。上面的我的custom_comparer也使用它,但插入了自定義比較器。自定義比較器使用isdigit進行所需的比較。