首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何对按第二种类型(int)排序的二维数组进行排序?

如何对按第二种类型(int)排序的二维数组进行排序?
EN

Stack Overflow用户
提问于 2021-11-05 05:24:25
回答 1查看 46关注 0票数 0

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

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

代码语言:javascript
运行
复制
hello  3
jack   5
the    2
fish  10

排序后:

代码语言:javascript
运行
复制
fish  10
jack   5
hello  3
the    2
EN

回答 1

Stack Overflow用户

发布于 2021-11-05 06:56:10

如果你有你的std::array<std::pair<std::string,int>,4>并且想要对int值进行降序排序(例如,对的.second成员),你可以简单地编写一个lamba函数,该函数接受两个std::pair<std::string,int>& a (和b)对,然后如果ab之前进行排序,则返回true,以便按照对的.second成员进行降序排序。

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

代码语言:javascript
运行
复制
  /* 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;
  };

通过在a.second大于b.second时返回true,您可以基于std::对的.second成员定义降序排序。

一个简短的例子是:

代码语言:javascript
运行
复制
#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';
}

示例使用/输出

代码语言:javascript
运行
复制
$ ./bin/sort_array_pairs
fish 10
jack 5
hello 3
the 2

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

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

例如:

代码语言:javascript
运行
复制
  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的调用将是:

代码语言:javascript
运行
复制
  std::sort (arr.begin(), arr.end(), sort_desc_2nd);

(结果相同)

我不确定其中一个是否比另一个更好,只知道您可以选择如何定义自定义排序,并选择最适合您的环境的方法。在评论中提供的@SomeProgrammerDude在std::sortlambda上显示了这两个示例。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69848966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档