Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 设置<;字符串>;像数字一样排序_C++_C++11 - Fatal编程技术网

C++ 设置<;字符串>;像数字一样排序

C++ 设置<;字符串>;像数字一样排序,c++,c++11,C++,C++11,我试图对字符串集进行排序,就好像它们是数字一样。 每个字符串的长度可以达到50,而且它们实际上不仅仅由数字组成。 正如我在论坛中了解到的,C++默认地按字典排序字符串。 是否有办法更改此默认行为以符合我的需要 我需要的是如下所示: set<string> solution; solution.insert("12X451"); solution.insert("X23454"); solution.insert("12345"); solut

我试图对字符串集进行排序,就好像它们是数字一样。 每个字符串的长度可以达到50,而且它们实际上不仅仅由数字组成。 正如我在论坛中了解到的,C++默认地按字典排序字符串。 是否有办法更改此默认行为以符合我的需要

我需要的是如下所示:

    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;
    }
我需要的是:

5231
12315
12345   
123111
12X451
X23454

您应该将Compare函数作为set的构造函数参数传递,以实现此效果

bool compare(string s1, string s2)
{
  if(s1.size() == s2.size()) return s1 < s2;
  return s1.size() < s2.size();
}
bool比较(字符串s1、字符串s2)
{
如果(s1.size()==s2.size())返回s1
根据您的小游戏规则更改以上功能

或者您可以将比较函数类作为模板参数传递

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;
struct-cmp{
布尔运算符()(常量字符串和s1、常量字符串和s2)
{
如果(s1.size()s2.size())返回false;
返回s1

你对信件的预期行为是什么?字母总是比任何数字都大吗?是的,这就像他们的ASCII码。你能提供一个小例子吗?函数类通常比函数更好。它使指定模板参数(
Compare
vs
bool(*)(const-string&,const-string&)
)更加容易,并为内联提供了更好的范围。@MikeSeymour谢谢。我只是想给OP一个快速的开始指针。现在他可以使用一个函数类或其他他想要的替代品。我想在我的答案中添加函数类用法。我想s1.size()!=s2.size()节应为s1.size()==s2.size()
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;