2014-12-05 52 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