使用C ++中的整数进行排序(std :: sort的自定义用法)

时间:2015-09-08 22:33:01

标签: c++ sorting

我想要一个首先按数字排序的字符串列表,如果该数字等于0,则按字母顺序排序。

让我说我有:

numberedString a[]

我有一个数组std::sort()如何使用numberedString.s对数组中的条目进行排序?我想我首先需要对所有numberedString.n进行排序,然后按{{1}}进行排序,但我不明白这是怎么做到的?

2 个答案:

答案 0 :(得分:1)

问你,你会收到。干得好。

案例1:专业功能对象 - 仿函数。

struct functor
{
  bool operator() (const numberedString& a,
                   const numberedString& b)
  {
    if ((a.n != 0) && (b.n != 0))
    {
       return a.n < b.n;
    }
    return a.s < b.s;
  }
};

案例2:重载运算符&lt;在结构中。

struct numberedString
{
  string s;
  int n;
  bool operator<(const numberedString& other) const
  {
    if ((n != 0) && (other.n != 0))
    {
       return n < other.n;
    }
    return s < other.s;
  }
};

用法:
重载operator<允许函数自然地比较结构的实例:

  numberedString c, d;
  if (c < d)
  {
    cout << "c < d\n";
  }
  else
  {
    cout << "c >= d\n";
  }

仿函数允许您将比较算法传递给排序函数,如std::sort

   numberedString array[25];
   std::sort(&array[0], &array[25], functor);  

注意:请参阅std :: sort以获取确切的语法。

BTW,当一个变量的数量为零而另一个变量的数量为零时,有哪些规则?

答案 1 :(得分:-1)

基本上,您的结构非常简单,您可以用std::pair替换它。

using numberedString = std::pair<int, std::string>;

然后你可以按照普通的方式使用std::sort,并且由于std::pair词典比较,你可以获得所需的效果,简单并且无需定义自定义比较器(以下示例):

#include <iostream>
#include <utility>
#include <vector>
#include <string>
#include <algorithm>

using numberedString = std::pair<int, std::string>;

int main() {
  numberedString vec1[] = {{4, "four"}, {2, "two"}, {1, "one"}};
  std::sort(std::begin(vec1), std::end(vec1));
  for(auto &&i : vec1) std::cout << i.first << " -- " << i.second << '\n';
  std::cout << std::endl;

  numberedString vec2[] = {{0, "four"}, {0, "two"}, {0, "one"}};
  std::sort(std::begin(vec2), std::end(vec2));
  for(auto &&i : vec2) std::cout << i.first << " -- " << i.second << '\n';
}

LIVE DEMO