2012-07-03 39 views
3

我需要在地圖中存儲各種字符串,但我想讓它們按大小排序。std ::映射排序謂詞按字符串大小排序但保留不同的字符串?

使用這樣的斷言:

struct strsize_less { 
    bool operator()(const string& l, const string& r) { 
     return l.size() < r.size(); 
    }; 
}; 

將完成訂貨,但它會與同尺寸丟棄串

int main() { 
    typedef map<string, int, strsize_less> mymap_t; 
    mymap_t mymap; 

    mymap["j" ] = 0; 
    mymap["i" ] = 1; 
    mymap["hh" ] = 2; 
    mymap["gg" ] = 3; 
    mymap["fff" ] = 4; 
    mymap["eee" ] = 5; 
    mymap["dddd" ] = 6; 
    mymap["cccc" ] = 7; 
    mymap["bbbbb"] = 8; 
    mymap["aaaaa"] = 9; 

    for(mymap_t::iterator i = mymap.begin(); i!=mymap.end(); ++i) 
     cout << "k = " << i->first << " - > v= " << i->second << endl; 

    return 0; 
} 

輸出爲:

​​

我的問題:有沒有我可以用於achi的謂詞前夜以下的輸出:

k = j - > v= 0 
k = i - > v= 1 
k = hh - > v= 2 
k = gg - > v= 3 
k = fff - > v= 4 
k = eee - > v= 5 
k = dddd - > v= 6 
k = cccc - > v= 7 
k = bbbbb - > v= 8 
k = aaaaa - > v= 9 
+1

不丟棄相等的鍵聽起來更像是一個'multimap'。 –

+0

您可以使用比較運算符將大小用作第一條件,將實際內容用作匹配大小的第二條件。 –

回答

13

比較兩者的大小和比較器的字符串:

struct strsize_less 
{ 
    bool operator()(std::string const& l, std::string const& r) const 
    { 
     if (l.size() < r.size()) 
      return true; 

     if (l.size() > r.size()) 
      return false; 

     return l < r; 
    }; 
}; 

或者,使用C++ 11的std::tie

struct strsize_less 
{ 
    bool operator()(std::string const& l, std::string const& r) const 
    { 
     return std::tie(l.size(), l) < std::tie(r.size(), r); 
    }; 
}; 
+1

您可以將第一部分重寫爲if(l.size()!= r.size())返回l.size() templatetypedef

+4

@templatetypedef:是。在編寫關係比較器時,我更願意堅持使用關係運算符(而不是使用相等運算符)。我也認爲代碼更清晰:我已經調試了足夠的不正確的嚴格 - 弱類型,我認爲最好遵循一個通用模式,使代碼非常清晰。 –

+1

我建議使用'std :: tie'而不是將字符串複製到一個元組中,僅用於比較目的。 – Xeo

2
return l.size() < r.size() 
    || (l.size() == r.size() && l < r);