如何根据对的第二个元素对一个对的向量进行sorting?

如果我有一个对的向量:

std::vector<std::pair<int, int> > vec; 

有没有简单的方法来根据对的第二个元素升序排列列表?

我知道我可以写一个小的函数对象来完成这个工作,但是有没有办法使用STLstd::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,现在可以有autotypes的参数。 这是我目前最喜欢的解决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()