【问题标题】:std::priority_queue complex types?std::priority_queue 复杂类型?
【发布时间】:2013-07-28 07:48:33
【问题描述】:

我想使用复杂类型的 std::priority_queue:

typedef struct
{
uint8_t data;
    uint64_t moredata;
}myData;

typedef struct
{
    boost::mutex someQueueLock;
    std::priority_queue<myData> myQueue; //does not work
}

我不想使用充满指针的队列 (priority_queue),因为指针可能会变得无效。

这甚至可能吗?还是应该使用另一个标准容器?

【问题讨论】:

    标签: c++ data-structures struct std priority-queue


    【解决方案1】:

    std::priority_queue 默认使用operator&lt; 对元素进行排序,它要求元素是严格弱排序

    你需要为myData类型定义operator&lt;函数

    bool operator<(const myData& lhs, const myData& rhs)
    {
        return lhs.data < rhs.data;
    }
    

    § 23.6.4.1 类模板priority_queue

    任何具有随机访问迭代器和支持操作front()、push_back()和pop_back()的序列容器都可以用来实例化priority_queue。特别是,可以使用向量 (23.3.6) 和双端队列 (23.3.3)。实例化 priority_queue 还涉及提供一个函数或函数对象来进行优先级比较;该库假定函数或函数对象定义了严格的弱排序 (25.4)。

    § 25.4

    25.4 中的所有操作都有两个版本:一个采用比较类型的函数对象,另一个使用运算符<.>

    【讨论】:

      【解决方案2】:

      你需要定义自己的比较函数,这样priority_queue就会知道哪些item的优先级更高。

      bool MyCompare(const myData& left, const myData& right)
      {
          // todo: return true if left has higher priority than right
      }
      
      std::priority_queue<myData, std::vector<myData>, MyCompare> queue;
      

      【讨论】:

        猜你喜欢
        • 2017-05-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-02-09
        • 1970-01-01
        • 2013-07-02
        • 1970-01-01
        相关资源
        最近更新 更多