如何解决使用公共函数作为排序标准,C++;
考虑这个例子,我有较少的公共函数,我想用作比较器。
附注我知道如果我将其更改为 operator<
它将起作用。
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
int main()
{
std::set<A,A::less> s;
}
这给了我一个错误,即less不是一个有效的模板。
任何人都可以帮我通过 lass 作为比较器吗?
如果它不可能,你能告诉我任何解决方法而不触及类本身。
解决方法
如果你不想使用操作符
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
struct A_wrapped{
bool operator()(const A&a,const A&b) {
return a.less(b);
}
}
int main()
{
std::set<A,A_wrapped> s;
}
这样做的好处是你不必向构造函数传递任何东西,类型定义足以告诉它你自己比较的用法。
,std::set
的第二个参数需要是 type,而不是 value。
它还必须是一个类型,其中 comp(a,a)
是有效表达式,其中 comp
是比较类型的值,而 a
是元素类型的值,所以我们不能直接使用指向成员函数的指针。
std::set<A,decltype(std::mem_fn(&A::less))> s(std::mem_fn(&A::less)));
,
您可以在仅调用 less()
的全局范围内声明小于运算符。这满足您不修改类的标准:
class A {
std::string str;
int id;
public:
virtual bool less(A const& rhs) const{
return id < rhs.id;
}
};
bool operator<(const A& lhs,const A& rhs) {
return lhs.less(rhs);
}
int main()
{
std::set<A> s;
}
,
你可以定义一个比较器。
int main()
{
auto comp = [](const A& a,const A& b){return a.less(b);};
std::set<A,decltype(comp)> s{comp};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。