如果我有一对配对:
std::vector<std::pair<int, int> > vec;
是否有简单的方法根据对中的第二个元素按递增顺序对列表进行排序?
我知道我可以编写一个可以完成工作的小函数对象,但有没有办法使用 STL 和std::less
的现有部分直接完成工作?< / p>
编辑:我知道我可以编写一个单独的函数或类来传递给第三个参数进行排序。问题是我是否可以用标准的东西来构建它。我的确看起来很像:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
答案 0 :(得分:184)
编辑:使用c ++ 14,由于lambda现在可以使用auto
类型的参数,因此最好的解决方案非常容易编写。 这是我目前最喜欢的解决方案
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
只需使用自定义比较器(它是std::sort
的可选第三个参数)
struct sort_pred {
bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
}
};
std::sort(v.begin(), v.end(), sort_pred());
如果您使用的是C ++ 11编译器,则可以使用lambdas编写相同的内容:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
编辑:根据您对问题的修改,这里有一些想法...... 如果你真的想要有创意并且能够重复使用这个概念,那就制作一个模板:
template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
Pred p;
return p(left.second, right.second);
}
};
然后你也可以这样做:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
甚至
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
虽然老实说,这有点矫枉过正,只需编写3行函数并完成它:-P
答案 1 :(得分:70)
你可以像这样使用boost:
std::sort(a.begin(), a.end(),
boost::bind(&std::pair<int, int>::second, _1) <
boost::bind(&std::pair<int, int>::second, _2));
我不知道这样做的标准方法同样简洁明了,但你可以抓住boost::bind
它们都包含标题。
答案 2 :(得分:29)
使用C ++ 0x,我们可以使用lambda函数:
using namespace std;
vector<pair<int, int>> v;
.
.
sort(v.begin(), v.end(),
[](const pair<int, int>& lhs, const pair<int, int>& rhs) {
return lhs.second < rhs.second; } );
在此示例中,隐式推断了返回类型bool
。
Lambda返回类型
当lambda函数有一个语句,并且这是一个return语句时,编译器可以推导出返回类型。从C ++ 11开始,§5.1.2/ 4:
...
- 如果复合语句的格式为
{ return expression ; }
,则在左值到右值转换(4.1),数组到指针转换(4.2)和函数到指针之后返回表达式的类型转换(4.3);- 否则,
void
。
要明确指定返回类型,请使用[]() -> Type { }
形式,如:
sort(v.begin(), v.end(),
[](const pair<int, int>& lhs, const pair<int, int>& rhs) -> bool {
if (lhs.second == 0)
return true;
return lhs.second < rhs.second; } );
答案 3 :(得分:28)
非常简单 你使用算法中的sort函数并添加你自己的比较函数
vector< pair<int,int > > v;
sort(v.begin(),v.end(),myComparison);
现在你必须根据第二个选择进行比较 所以声明你&#34; myComparison&#34;如
bool myComparison(const pair<int,int> &a,const pair<int,int> &b)
{
return a.second<b.second;
}
答案 4 :(得分:5)
对于可重复使用的东西:
template<template <typename> class P = std::less >
struct compare_pair_second {
template<class T1, class T2> bool operator()(const std::pair<T1, T2>& left, const std::pair<T1, T2>& right) {
return P<T2>()(left.second, right.second);
}
};
您可以将其用作
std::sort(foo.begin(), foo.end(), compare_pair_second<>());
或
std::sort(foo.begin(), foo.end(), compare_pair_second<std::less>());
答案 5 :(得分:1)
您必须依赖非标准select2nd
答案 6 :(得分:-1)
尝试交换对的元素,以便正常使用std::sort()
。