在向量上使用STL排序算法时,我想传入我自己的比较函数,该函数也需要一个参数.
例如,理想情况下我想做一个本地函数声明,如:
int main() {
vector<int> v(100);
// initialize v with some random values
int paramA = 4;
bool comp(int i, int j) {
// logic uses paramA in some way...
}
sort(v.begin(), v.end(), comp);
}
Run Code Online (Sandbox Code Playgroud)
但是,编译器抱怨这一点.当我尝试这样的事情:
int main() {
vector<int> v(100);
// initialize v with some random values
int paramA = 4;
struct Local {
static bool Compare(int i, int j) {
// logic uses paramA in some way...
}
};
sort(v.begin(), v.end(), Local::Compare);
}
Run Code Online (Sandbox Code Playgroud)
编译器仍然抱怨:"错误:使用包含函数的参数"
我该怎么办?我应该用全局比较函数制作一些全局变量吗?
谢谢.
Ada*_*eld 29
您无法从本地定义的函数中访问函数的局部变量 - 当前形式的C++不允许闭包.该语言的下一个版本C++ 0x将支持此功能,但语言标准尚未最终确定,目前对当前的标准草案几乎没有支持.
为了使这项工作,你应该改变的第三个参数std::sort是一个对象实例,而不是一个功能.第三个参数std::sort可以是任何可调用的东西(即任何x添加括号的地方x(y, z)都会产生语法意义).执行此操作的最佳方法是定义实现该operator()函数的结构,然后传递该对象的实例:
struct Local {
Local(int paramA) { this->paramA = paramA; }
bool operator () (int i, int j) { ... }
int paramA;
};
sort(v.begin(), v.end(), Local(paramA));
Run Code Online (Sandbox Code Playgroud)
请注意,我们必须存储paramA在结构中,因为我们无法从内部访问它operator().
Pra*_*rav 13
在C++中,您无法在另一个函数中定义自由函数.所以你的第一个代码片段形成错误.
sort(v.begin(),v.end(),Local :: Compare);
第三个参数必须是一个函数对象.()在类中重载操作符然后创建函数对象.
在C++ 0x中,您可以使用lambda表达式.
auto comp = [&](int m,int n)-> bool {
return m<n; //or use paramA in some way
};
sort(v.begin(), v.end(), comp);
Run Code Online (Sandbox Code Playgroud)
一种可能性是在构造比较器对象时传递参数:
class cmp {
int param;
public:
cmp(int p) : param(p) {}
bool operator()(int i, int j) {
// logic uses param
}
};
int main() {
vector<int> v(100);
// initialize v with some random values
int paramA = 4;
sort(v.begin(), v.end(), cmp(paramA));
}
Run Code Online (Sandbox Code Playgroud)