2014-12-05 50 views
4

我試着對一組字符串進行排序,就好像它們是數字一樣。 每個字符串的長度可以達到50,而且它們實際上並不僅僅由數字組成。 正如我在論壇中所瞭解和搜索的,C++默認按字典順序對字符串進行排序。 有沒有辦法改變這種默認行爲以符合我的需求?設置<string>像數字排序

我需要的是象下面這樣:

set<string> solution; 

    solution.insert("12X451"); 
    solution.insert("X23454"); 
    solution.insert("12345"); 
    solution.insert("12315"); 
    solution.insert("123111"); 
    solution.insert("5231"); 

    for (auto s : solution) 
    { 
     cout << s << endl; 
    } 

此打印:

123111 
12315 
12345 
12X451 
5231 
X23454 

我需要的是:

5231 
12315 
12345 
123111 
12X451 
X23454 
+0

什麼是你的信預期的行爲?字母總是大於任何數字? – CoryKramer 2014-12-05 12:48:32

+0

是的,它就像他們的ASCII碼一樣。 – 2014-12-05 12:49:41

回答

5

你應該通過比較功能集的構造函數參數達到這個效果。

bool compare(string s1, string s2) 
{ 
    if(s1.size() == s2.size()) return s1 < s2; 
    return s1.size() < s2.size(); 
} 

根據您的小規則更改上述功能。

Live example here

或者你也可以通過比較功能類作爲模板參數。

struct cmp { 
    bool operator()(const string &s1, const string &s2) 
    { 
     if(s1.size() < s2.size()) return true; 
     if(s1.size() > s2.size()) return false; 
     return s1 < s2; 
    } 
}; 
... 
set<string, cmp> solution; 

Live example here

+1

你能否提供一個小例子? – 2014-12-05 12:51:06

+0

函數類通常比這裏的函數更好。它可以更容易地指定模板參數('Compare' vs'bool(*)(const string&,const string&)'),並給出更好的內聯範圍。 – 2014-12-05 12:57:40

+1

@MikeSeymour謝謝。我只是想給OP一個快速的開始指針。現在他可以按照自己的意願使用功能類或其他選擇。我會在我的答案中添加函數類的用法。 – 2014-12-05 13:00:50