【问题标题】:Move-initialize a priority_queue from a vector?从向量中移动初始化priority_queue?
【发布时间】:2017-11-08 22:16:22
【问题描述】:

我看到了这个leetcode question 并想用优先级队列而不是向量来解决它(因此 O(nlogk) 而不是 O(nk))。如何使用给定的向量作为底层容器移动初始化 priority_queue?这是我尝试过的,但我显然误解了docs,因为它不会编译。

struct ListNode {
    int val;
    ListNode *next;
    ListNode(int x) : val(x), next(NULL) {}
};

class cmp{
    public:
    bool operator()(const ListNode *a,const ListNode *b) const {
        if(b==nullptr) return false;
        return a==nullptr || a->val>b->val;
    }
};
class Solution {
    ListNode* helper(auto& lists) {
        ListNode *ans=lists.top();lists.pop();
        if(ans==nullptr) return nullptr;
        lists.push(ans->next);
        ans->next=helper(lists);
        return ans;
    }
public:
    ListNode* mergeKLists(vector<ListNode*>& lists) {
        if(lists.empty()) return nullptr;
        priority_queue<ListNode*,vector<ListNode*>> pq(cmp,std::move(lists)); //compiler says error: 'std::move' is not a type
        return helper(pq);
    }
};

【问题讨论】:

  • 通常,当您有无法编译的代码时,最好将编译错误添加到帖子中。如果您尝试使用不同的编译器(例如 gcc 和 clang)并同时发布两个错误,则可以加分。

标签: c++ move-semantics


【解决方案1】:

你是说

priority_queue<ListNode*, vector<ListNode*>, cmp> pq{ cmp{}, std::move(lists) };

?

您的代码失败,因为默认情况下比较器是std::less&lt;typename Container::value_type&gt;(因此您必须在模板参数中明确写入cmp)并且因为参数必须是cmp 的实例(不是类,实际上类是不是 C++ 中的一等公民,您不能将它们作为参数传递)。

【讨论】:

    猜你喜欢
    • 2011-05-18
    • 1970-01-01
    • 2011-03-04
    • 2012-06-13
    • 2012-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多