二维向量自定义谓词更大的功能

two-dimension vector custom predicate greater function

我有一个二维向量,如下所示。

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:错误:必须调用对非静态成员函数的引用 排序(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];
    }
};

secondGreater 是一个成员函数。但是您正在尝试调用它,就像它是一个没有关联对象的自由函数一样。

因为它不访问任何成员变量,所以它不需要是一个成员函数,把它移到class之外:

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

class Solution

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

static bool secondGreater( ...

如果你出于某种原因需要它成为一个非静态成员函数,也就是你将来需要来自 class 的状态,那么你可以 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];
});

让它静态化,然后它应该可以工作:

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

如果需要非静态函数,可以通过

实现
sort(boxTypes.begin(), boxTypes.end(), std::bind(&Solution::secondGreater, this, std::placeholders::_1, std::placeholders::_2));

一个简单的修复可能是。只需在比较函数前添加 static

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