为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
炎炎设计 2019-08-09 17:45:07
如何根据对的第二个元素对对向量进行排序?如果我有一对矢量:std::vector<std::pair<int, int> > vec;是否有简单的方法根据对的第二个元素按递增顺序对列表进行排序?我知道我可以编写一个可以完成工作的小函数对象,但是有没有办法使用STL的现有部分并std::less直接进行工作?编辑:我明白我可以编写一个单独的函数或类来传递给第三个参数进行排序。问题是我是否可以用标准的东西来构建它。我真的看起来像:std::sort(vec.begin(), vec.end(), std::something_magic<int, int, std::less>());
查看完整描述

3 回答

?
qq_笑_17

TA贡献1818条经验 获得超7个赞

使用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



查看完整回答
反对 回复 2019-08-09
?
守候你守候我

TA贡献1802条经验 获得超10个赞

你可以像这样使用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它所有的标题。


查看完整回答
反对 回复 2019-08-09
?
慕容708150

TA贡献1831条经验 获得超4个赞

它非常简单,您可以使用算法中的sort函数并添加自己的比较函数

vector< pair<int,int > > v;sort(v.begin(),v.end(),myComparison);

现在你必须根据第二个选择进行比较,因此将“myComparison”声明为

bool myComparison(const pair<int,int> &a,const pair<int,int> &b){
       return a.second<b.second;}


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 568 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信