微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用公共函数作为排序标准,C++;

如何解决使用公共函数作为排序标准,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 举报,一经查实,本站将立刻删除。