【问题标题】:Custom comparator for multiset that contains pointers to objects包含指向对象的指针的多集的自定义比较器
【发布时间】:2012-08-02 09:35:50
【问题描述】:

抱歉标题不清楚,实际上我想不出一个简洁地描述我的问题的标题。

但问题说起来很简单。我有一个节点类。我想通过它的 id_ 字段来维护它的对象之间的顺序。我知道如果我在 Node 类中重载 将正确维护容器中的顺序。但我想声明一个 multiset 容器并希望实现相同的行为。

这是我的 Node 类定义:

class Node {
        int id_;
        ...
        public:
        Node() {
                ...
        }
        int getId() {
                return id_;
        }
        void setId(int id) {
                id_ = id;
        }
        ...
        bool operator<(const Node &input) {
                return (this->id_ < input.id_);
        }
};

我该怎么办?

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:

    我认为你的意思和你需要的是这样的:

    template <typename T, typename Pred = std::less<T>>
    struct ptr_compare : Pred
    {
        ptr_compare(Pred const & p = Pred()) : Pred(p) { }
    
        bool operator()(T const * p1, T const * p2) const
        {
            return Pred::operator()(*p1, *p2);
        }
    };
    
    typedef std::multiset<Node*, ptr_compare<Node>> node_ptr_set;
    

    您可以将ptr_compare 模板用于任何需要二元谓词并且希望间接应用谓词的容器。

    【讨论】:

    • 在第一个站点看起来很深奥。难道没有其他更简单的方法吗?或者你能忍受一些痛苦并解释一下吗?谢谢!
    • @Prab:它只是一个包装器,它接受指针并将它们转发到原始谓词的解引用...什么需要解释?你知道std::less&lt;T&gt; 是如何工作的吗?
    • 是的,但什么是 Pred?我理解的其他所有内容。
    • @Prab 是一个模板参数,默认为std::less&lt;T&gt;。它允许您在ptr_compare 中使用自己的比较逻辑,这是有道理的,因为比较不应仅限于小于。
    • 这可能很明显,但我们使用继承而不是组合的原因是我们可以利用空基优化,因为像这样的 trait 类通常是空的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-14
    • 2017-04-10
    • 2021-11-06
    • 2013-12-01
    • 1970-01-01
    • 2015-08-07
    • 2011-04-28
    相关资源
    最近更新 更多