二维向量自定义谓词更大的功能
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];
}
我有一个二维向量,如下所示。
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];
}