首页 > 解决方案 > 二维向量自定义谓词更大功能

问题描述

我有一个像下面这样的二维向量。

vector<vector<int>> vec = {{2,5}, {3, 4}, {0,1}, {1,2}}

我想根据每个 vec[i] 的第二个元素对这个数组进行排序。所以最终结果应该是

{{2,5},{3,4},{1,2}, {0,1}}

我想使用类似的东西

sort(vec.begin(), vec.end(), secondGreater);

bool secondGreater(vector<int> a, vector<int> b){
  return a[1]>b[1];
}

我的想法是:vec 的每个元素都是一个一维向量,所以我提供了一个函数来比较两个一维向量。但不知何故,它不起作用。有什么提示吗?

谢谢。

//------------------------------------------------ -

代码如下,错误信息是

第 6 行:字符 46:错误:必须调用非静态成员函数的引用 sort(boxTypes.begin(), boxTypes.end(), secondGreater); ^~~~~~~~~~~~~ 产生1个错误。

class Solution {
public:
    int maximumUnits(vector<vector<int>>& boxTypes, int truckSize) {
      int cnt=0;
      
      sort(boxTypes.begin(), boxTypes.end(), secondGreater);
      
      for(auto i=0;i<boxTypes.size();i++){
        if(truckSize > boxTypes[i][0]){
          cnt+= boxTypes[i][0] * boxTypes[i][1];
          truckSize -= boxTypes[i][0];
        }
        else if(truckSize>0 && truckSize < boxTypes[i][0]){
          cnt+= boxTypes[i][1] * truckSize;
          break;
        }
        else break;
      }
      return cnt;
      
    }
    
    bool secondGreater(vector<int> boxA, vector<int> boxB){
      return boxA[1] > boxB[1];
    }
};

标签: c++sortingpredicate

解决方案


secondGreater是成员函数。但是你试图调用它,就好像它是一个没有关联对象的自由函数。

由于它不访问成员变量,因此它不需要是成员函数,将其移出类:

bool secondGreater(vector<int> boxA, vector<int> boxB){
   return boxA[1] > boxB[1];
}

class Solution

如果您出于某种原因需要它在课堂上,您可以将其设为静态:

static bool secondGreater( ...

如果您出于某种原因需要它成为非静态成员函数,也就是您将来需要类中的状态,那么您可以 bind this使用它:

sort(boxTypes.begin(), boxTypes.end(), std::bind(secondGreater, this, _1, _2)); 
// This code is only psuedo code. 

或者因为它很简单,只需用 lambda 替换整个内容:

sort(boxTypes.begin(), boxTypes.end(), [](vector<int> boxA, vector<int> boxB){
   return boxA[1] > boxB[1];
});

推荐阅读