首页 > 解决方案 > 自定义排序向量 2d c++17 发送到后面

问题描述

我知道我们可以使用 c++17 对 std::vector 进行排序

但我想定制这个

目前,我正在这样做,v 是vector<vector<int>>

v=[[10,125],[2,13],[3,2],[1,2]]

我想根据两个数字的总和对这个二维向量进行排序,我还想将这些对发送到向量的末尾,该向量的第一个索引高于第二个索引,即如果a[i][0]>a[i][1] send this pair to back/end of vector.

std::sort(v.begin(),v.end(),[](const vector<int> &a,const vector<int> &b){
            if(a[0]>a[1]){
                 //send to back        
            }
            if((a[0]+a[1])<(b[0]+b[1])){
                return 1;
            }else{
                 return 0;
            }
        });

我希望矢量应该看起来像

v=[[1,2],[2,13],[10,125],[3,2]]

标签: c++stl

解决方案


我发现以下风格更容易推理。你已经给出了两个规则,按重要性排序:

  1. 具有特定顺序的对应该是第一个。
  2. 否则,按总和进行比较。
std::sort(v.begin(), v.end(), [](std::vector<int> &lhs, std::vector<int> &rhs) {
   const int lhs_sum = lhs[0] + lhs[1];
   const int lhs_order = lhs[0] > lhs[1];
   const int rhs_sum = rhs[0] + rhs[1];
   const int rhs_order = rhs[0] > rhs[1];

   return std::tie(lhs_order, lhs_sum) < std::tie(rhs_order, rhs_sum);
});

推荐阅读