c++ - 如何对按第二种类型(int)排序的二维数组对进行排序?
问题描述
我有一个二维数组,它计算一个单词出现的次数。我想对其进行排序,以便出现最多的单词排在第一位。
示例 2D 数组(排序前):
hello 3
jack 5
the 2
fish 10
排序后:
fish 10
jack 5
hello 3
the 2
解决方案
如果您有std::array<std::pair<std::string,int>,4>
并且想要对int
值进行降序排序(例如,该对的成员),您可以简单地编写一个带有两个(和)对.second
的 Lamba 函数,然后返回if sorts before用于按成员的降序排序一对。std::pair<std::string,int>& a
b
true
a
b
.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;
};
通过返回true
whena.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 。struct
std::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::sort和lambda作为评论中提供的@SomeProgrammerDude。
推荐阅读
- node.js - 有人知道如何使用 NodeJs 将音频/图像发送到 Telegram 机器人吗?
- javascript - 发布 SNS 时 AWS Lambda 超时
- java - JPQL 查询使用 AttributeConverter 存储的列表中的项目
- c# - 在我的警报程序上需要帮助
- python - 如何在 QScintilla 中实现与多项选择一起使用的评论功能?
- c++ - 用于包括警卫的名称?
- java - 将 Spring Boot 属性 Bean 传递给其他项目中的类
- c++ - 忽略由 3rd 方标头引起的 [clang-diagnostic-error] clang-tidy
- graphdb - 擦除 GraphDB 中的存储库后重建自动完成索引
- ruby - Ruby:TDD 加编码