如何根据对的第二个元素对一个对的向量进行sorting?
如果我有一个对的向量:
std::vector<std::pair<int, int> > vec;
有没有简单的方法来根据对的第二个元素升序排列列表?
我知道我可以写一个小的函数对象来完成这个工作,但是有没有办法使用STL和std::less
现有部分来直接完成这个工作?
编辑:我明白,我可以编写一个单独的函数或类传递给第三个参数进行sorting。 问题是我是否可以用标准的东西来构build它。 我真的看起来像这样:
std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
你可以像这样使用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
它的所有包含标题。
编辑 :使用C ++ 14,最好的解决scheme是非常容易写感谢lambda,现在可以有auto
types的参数。 这是我目前最喜欢的解决scheme
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> >());
虽然说实话,这有点矫枉过正,只写三线function就可以了:-P
用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; } );
在这个例子中,隐式地推导了返回typesbool
。
Lambda返回types
当一个lambda函数有一个单一的语句,这是一个返回语句,编译器可以推导出返回types。 从C ++ 11,§5.1.2/ 4开始:
…
- 如果复合语句的格式是
{ return expression ; }
{ return expression ; }
左值到右值转换(4.1),数组到指针转换(4.2)和函数到指针转换(4.3)之后的返回expression式的types。- 否则,
void
。
要显式指定返回types,请使用[]() -> 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; } );
它很简单,你使用algorithm的sortingfunction,并添加自己的比较function
vector< pair<int,int > > v; sort(v.begin(),v.end(),myComparison);
现在,您必须根据第二个select进行比较,以便将“myComparison”声明为
bool myComparison(const pair<int,int> &a,const pair<int,int> &b) { return a.second<b.second; }
对于可重用的东西:
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>());
你必须依靠一个非标准的select2nd
尝试交换对的元素,以便正常使用std::sort()
。