【问题标题】:Use public function as sorting criteria, C++;使用公共函数作为排序标准,C++;
【发布时间】:2021-03-10 15:33:55
【问题描述】:

考虑这个例子,我想要用作比较器的公共函数较少。
附言我知道如果我将其更改为 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 作为比较器吗? 如果不可能,您能否在不触及课程本身的情况下告诉我任何解决方法。

【问题讨论】:

  • 为什么它首先是虚拟的?

标签: c++ sorting set functor


【解决方案1】:

std::set的第二个参数需要是type,而不是value

它还必须是一个类型,其中comp(a, a) 是一个有效的表达式,其中comp 是比较类型的值,a 是元素类型的值,所以我们不能使用直接指向成员函数。

std::set<A, decltype(std::mem_fn(&A::less))> s(std::mem_fn(&A::less)));

【讨论】:

    【解决方案2】:

    如果您不想使用操作符

    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&lt;A, A_wrapped&gt; s;
    • @Damien 是的,谢谢。复制并粘贴错误。
    • @largest_prime_is_463035818 还有什么可能吗?
    • Compare不需要FunctionObject,可以是函数指针或成员函数指针类型。
    【解决方案3】:

    您可以在全局范围内声明一个小于运算符,它只会调用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;
    }
    

    【讨论】:

      【解决方案4】:

      你可以定义一个比较器。

      int main()
      {
          auto comp = [](const A& a, const A& b){return a.less(b);};
          std::set<A,decltype(comp)> s{comp};
      }
      

      【讨论】:

        猜你喜欢
        • 2013-10-26
        • 2019-09-24
        • 1970-01-01
        • 2015-01-01
        • 1970-01-01
        • 2017-09-16
        • 2012-01-05
        • 1970-01-01
        • 2017-08-03
        相关资源
        最近更新 更多