首页 > 解决方案 > 如何对按第二种类型(int)排序的二维数组对进行排序?

问题描述

我有一个二维数组,它计算一个单词出现的次数。我想对其进行排序,以便出现最多的单词排在第一位。

示例 2D 数组(排序前):

hello  3
jack   5
the    2
fish  10

排序后:

fish  10
jack   5
hello  3
the    2

标签: c++

解决方案


如果您有std::array<std::pair<std::string,int>,4>并且想要对int值进行降序排序(例如,该对的成员),您可以简单地编写一个带有两个(和)对.second的 Lamba 函数,然后返回if sorts before用于按成员的降序排序一对。std::pair<std::string,int>& abtrueab.second

例如,您可以编写一个名为的 lambdahow来告诉std::sort如何对数组对进行排序。它可以写成:

  /* lambda to sort std::pair<std::string,int> by .second descending */
  auto how = [](std::pair<std::string,int>& a,
                std::pair<std::string,int>& b) {
    return a.second > b.second;
  };

通过返回truewhena.second大于,您可以根据std::pair 的成员b.second定义降序排序。.second

一个简短的例子是:

#include <iostream>
#include <algorithm>
#include <array>
#include <string>

int main (void) {
  
  /* std::pair is an aggregate and its initializer must be {..} enclosed
   * std::array { std::pair { pairs {"s", n}, {"t", m}, ... } }
   */
  std::array<std::pair<std::string,int>,4> arr {{ {"hello", 3},
                                                  {"jack", 5},
                                                  {"the", 2},
                                                  {"fish", 10} }};
  
  /* lambda to sort std::pair<std::string,int> by .second descending */
  auto how = [](std::pair<std::string,int>& a,
                std::pair<std::string,int>& b) {
    return a.second > b.second;
  };
  
  /* sort arr */
  std::sort (arr.begin(), arr.end(), how);
  
  /* output result */
  for (const auto& p : arr)
    std::cout << p.first << " " << p.second << '\n';
}

示例使用/输出

$ ./bin/sort_array_pairs
fish 10
jack 5
hello 3
the 2

使用类/结构模板重载operator()

是另一个选项,它允许您提供与使用上面的 lambda 执行相同操作的类实现std::sort。您可以使用with 类型编写一个重载bool operator()并返回相同比较的短结构,而不是 lamba 。structstd::sort

例如:

  struct {
    bool operator() (std::pair<std::string,int>& a,
                     std::pair<std::string,int>& b) const {
      return a.second > b.second;
    }
  } sort_desc_2nd;

你的电话std::sort是:

  std::sort (arr.begin(), arr.end(), sort_desc_2nd);

(同样的结果)

我不确定一个是否优于另一个,只知道您可以选择如何定义自定义排序并选择最适合您情况的方法。两者的示例都显示在std::sortlambda作为评论中提供的@SomeProgrammerDude。


推荐阅读