关于修改函子的参数
About modifying the parameter of a functor
我有以下字符串对象的比较器
struct Comparator{
int x;
bool operator() (string a, string b) {
int i = 1;
if(a < b) {
i = -1;
}
i*= x;
if(i==-1) {
return true;
}
return false;
}
};
如您所见,它有一个参数 x.当它 = 1 时,字符串的比较是正常的,当它是 =-1 时,比较是反转的。
当在像sort
这样的方法中使用它时,对于vector
元素,我可以给这个比较器的对象实例以正确的x
,但是当我想把这个比较器提供给像set
这样的模板类时,我需要给出一个类而不是一个对象实例。所以我看到的唯一解决方案是使x
静态。有没有更好的解决方案?
这是我想使用此比较器的 main 示例:
int main(int argc, char** argv)
{
vector<string> vec;
vec.push_back("c");
vec.push_back("a");
vec.push_back("b");
Comparator comp;
comp.x = 1; // for normal comparison
comp.x = -1; // for inverse comparison
sort(vec.begin(),vec.end(), comp); // here I can give the functor instance
for(vector<string>::iterator it = vec.begin() ; it != vec.end(); it++)
{
cout << *it << endl;
}
set<string, Comparator> ss; // but here I must give the name of the functor class
ss.insert("c");
ss.insert("a");
ss.insert("b");
for(set<string>::iterator it = ss.begin() ; it != ss.end(); it++)
{
cout << *it << endl;
}
return 0;
}
set
的所有相关构造函数也采用Comp
类的实例。
set<string, Comparator> ss(Comparator(-1));
现在,您只需要一个构造函数,用于使用适当的值初始化其成员x
的 Comparator
。
也就是说,标准库已经附带了一个用于此目的的比较器类:
set<string, std::greater<std::string> > ss;
这是行不通的:a bool operator() (const std::string& a, const std::string& b) {
int result = a.compare(b) * x;
return result < 0;
}
相关文章:
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 修改函数中的指针(将另一个指针作为参数传递)
- 如果返回 -1,时间() 的参数是否被修改?
- 如何使用 swig 修改类构造函数以保留对其中一个构造函数参数的引用?
- 通过非常量引用参数修改常量引用参数
- 如何在使用 Qt5 构造函数时将非常量参数修改为常量参数?
- 如何接受可修改和不可修改的参数?
- 为什么我应该在scanf()-家族成员中包含一个长度修饰符作为参数?有什么好处?使用长度修改器进行扫描的作用
- 将参数从C/C++JNI传递给Java,得到修改后的值
- 如何修改此函数,以便如果函数的参数是特定结构,则返回具有较大整数的结构?
- 通过运算符使用标量参数重写来修改类成员
- 修改"参数视图属性"面板 (5.7.0) 上的默认属性
- 为什么 QObject::d isconnect(const QMetaObject::Connection &connection) 采用 const 参数并打算修改它?
- 非类型引用参数可以在运行时修改,这是否意味着模板可以在运行时实例化?
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- accept(..) 似乎正在修改我给它的文件描述符参数
- 是否允许删除以修改其参数
- 如何在编译时将整数模板参数修改为非零值
- C++,如何用新的参数修改正在执行的程序
- 如何通过参数修改指针