【问题标题】:Creating two priority queues from the same struct with the opposite order从同一个结构以相反的顺序创建两个优先级队列
【发布时间】:2013-03-06 14:36:40
【问题描述】:

我有这个结构:

struct Passenger
{
unsigned arrive;
unsigned depart;
};

现在我需要创建一个顺序相反的 A 和 B priority_queue。如果我重载运算符

我想知道,如何使用相反比较器创建这些优先级队列?

【问题讨论】:

  • 您希望这些问题是独立的,还是从一个队列中移除一名乘客会导致同一乘客从另一个队列中移除?

标签: c++ struct operator-overloading priority-queue


【解决方案1】:

您需要在创建优先级队列时指定比较器:

// For the moment, I'm specifying these to just compare arrival times.
// Modify that as needed.
struct GT {
    bool operator()(Passenger const &a, Passenger const &b) { 
       return b.arrive < a.arrive;
    }
};

struct LT { 
    bool operator()(Passenger const &a, Passenger const &b) { 
        return a.arrive < b.arrive;
    }
};

std::priority_queue<Passenger, std::vector<Passenger>, GT> max_heap;

std::priority_queue<Passenger, std::vector<Passenger>, LT> min_heap;

【讨论】:

    【解决方案2】:

    您可以为std::priority_queue指定一个比较器:

    typedef std::priority_queue<Passenger, std::vector<Passenger>> min_queue;
    typedef std::priority_queue<Passenger, std::vector<Passenger>, std::greater<Passenger>> max_queue;
    

    或者,通用:

    template <typename T, typename Container = std::vector<T>>
    using min_queue = std::priority_queue<T, Container>;
    
    template <typename T, typename Container = std::vector<T>>
    using max_queue = std::priority_queue<T, Container,
            std::greater<typename Container::value_type>>;
    

    然后:

    min_queue<Passenger> my_min_queue;
    max_queue<Passenger> my_max_queue;
    

    【讨论】:

      【解决方案3】:

      我建议您查看boost::multi_index,然后您可以拥有一个可以通过不同方式访问的单一集合。

      【讨论】:

        【解决方案4】:

        std::priority_queue 有第二个和第三个模板参数:

        • 第二个是底层容器,默认是std::vector
        • 第三个是比较器类,如std::mapstd::set

        所以你应该不要重载operator&lt;,因为那样使用起来不直观。相反,实现这些比较器:

        struct ArriveLess {
          bool operator()(Passenger const& lhs, Passenger const& rhs)
          { return lhs.arrive < rhs.arrive; }
        };
        
        struct DepartLess {
          bool operator()(Passenger const& lhs, Passenger const& rhs)
          { return lhs.depart < rhs.depart; }
        };
        
        /* ... */
        std::priority_queue<Passenger, std::vector<Passenger>, ArriveLess> A;
        std::priority_queue<Passenger, std::vector<Passenger>, std::not<ArriveLess>> B;
        

        【讨论】:

          【解决方案5】:

          您可以将“比较”函数传递给优先队列模板:

          std::priority_queue<Passenger> A;
          std::priority_queue<Passenger, std::vector<Passenger>, reverse_compare> B;
          
          bool Passenger::reverse_compare(const Passenger& rhs)
          {
            return rhs < *this;    /* Note reverse order! */
          }
          

          编辑:以上假设乘客有一个正常的operator &lt;

          [而且我太慢了!]

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-11-29
            • 2023-04-02
            • 1970-01-01
            • 2011-03-19
            • 1970-01-01
            相关资源
            最近更新 更多