【问题标题】:error: could not convert ‘minHeap’ from ‘std::priority_queue, std::greater >’ to ‘std::priority_queue错误:无法将“minHeap”从“std::priority_queue,std::greater >”转换为“std::priority_queue”
【发布时间】:2017-10-03 20:33:35
【问题描述】:

我是 C++ 的初学者。我正在尝试使用 std::priority_queue 创建一个 maxheap 和一个 minheap。只创建一个 maxheap 可以正常工作,但不能同时创建。我似乎无法理解错误。我收到以下错误: 无法将“minHeap”从“std::priority_queue, compare>”转换为“std::priority_queue” 尝试搜索互联网但无济于事。下面是代码。

void addNum(int num, priority_queue<int> maxHeap, priority_queue<int> minHeap) {
    if (minHeap.size() == 0 || num > minHeap.top()) 
        minHeap.push(num);
    else if (num < minHeap.top())
        maxHeap.push(num);
}

void createHeaps(vector<int> a) {
    priority_queue<int> maxHeap;
    priority_queue<int, vector<int>, greater<int> > minHeap;
    for (int i = 0; i < a.size(); ++i) {
        int num = a[i];
        addNum(num, maxHeap, minHeap);
    }
}

【问题讨论】:

  • priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt; &gt; 不是priority_queue&lt;int&gt;
  • priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt; &gt; 与priority_queue&lt;int&gt; 的类型不同...

标签: c++ priority-queue st


【解决方案1】:

您正在尝试使用priority_queue&lt;int, vector&lt;int&gt;, greater&lt;int&gt; &gt; 类型传递变量,但您的函数需要priority_queue&lt;int&gt; 类型。

修正函数原型:

void addNum(int num, priority_queue<int>& maxHeap, priority_queue<int, vector<int>, greater<int> >& minHeap) {
    if (minHeap.size() == 0 || num > minHeap.top()) 
        minHeap.push(num);
    else if (num < minHeap.top())
        maxHeap.push(num);
}

您必须使用引用。这是因为你需要修改原来的集合。

【讨论】:

    【解决方案2】:

    您的方法也必须使用正确的类型:

    void addNum(int num,
                priority_queue<int, >& maxHeap,
                priority_queue<int, std::vector<int>, std::greater<int>>& minHeap) {
        if (minHeap.size() == 0 || num > minHeap.top()) 
            minHeap.push(num);
        else if (num < minHeap.top())
            maxHeap.push(num);
    }
    

    或者您可以将您的方法模板化为更通用

    template <typename ... Ts1, typename ... Ts2>
    void addNum(int num,
                priority_queue<int, Ts1...>& maxHeap,
                priority_queue<int, Ts2...>& minHeap) {
        if (minHeap.size() == 0 || num > minHeap.top()) 
            minHeap.push(num);
        else if (num < minHeap.top())
            maxHeap.push(num);
    }
    

    甚至,简单地说:

    template <typename PriorityQueue1, typename PriorityQueue2>
    void addNum(int num,
                PriorityQueue1& maxHeap,
                PriorityQueue2& minHeap) {
        if (minHeap.size() == 0 || num > minHeap.top()) 
            minHeap.push(num);
        else if (num < minHeap.top())
            maxHeap.push(num);
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-18
      • 2019-11-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-28
      • 1970-01-01
      • 2013-07-02
      • 1970-01-01
      相关资源
      最近更新 更多