我有一个二维配对的数组,它计算一个单词出现的次数。我想对它进行排序,使出现次数最多的单词排在第一位。
示例2D数组(排序前):
hello 3
jack 5
the 2
fish 10排序后:
fish 10
jack 5
hello 3
the 2发布于 2021-11-05 06:56:10
如果你有你的std::array<std::pair<std::string,int>,4>并且想要对int值进行降序排序(例如,对的.second成员),你可以简单地编写一个lamba函数,该函数接受两个std::pair<std::string,int>& a (和b)对,然后如果a在b之前进行排序,则返回true,以便按照对的.second成员进行降序排序。
例如,您可以编写一个名为how的lambda来告诉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;
};通过在a.second大于b.second时返回true,您可以基于std::对的.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()的类/结构模板重载的
是另一个选项,它允许您提供一个类实现,它的作用与上面为std::sort使用的lambda相同。您可以使用struct类型和std::sort编写重载bool operator()并返回相同比较的简短结构,而不是lamba。
例如:
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);(结果相同)
我不确定其中一个是否比另一个更好,只知道您可以选择如何定义自定义排序,并选择最适合您的环境的方法。在评论中提供的@SomeProgrammerDude在std::sort和lambda上显示了这两个示例。
https://stackoverflow.com/questions/69848966
复制相似问题