This question already has answers here:
How to move elements out of STL priority queue

(2个答案)


2年前关闭。




我在priority_queue中有一个unique_ptr,我想将其从该集合中删除,然后将其放在双端队列中,同时保持unique_ptr的所有权语义。但是我找不到在没有编译错误的情况下将其从priority_queue中提取出来的方法:“试图引用已删除的函数”。什么是完成此任务的正确方法?
struct MyStruct {
    int val = 2;

    MyStruct(const int val) : val(val) {}
};

void testDeque() {
    std::priority_queue<std::unique_ptr<MyStruct>> q1;
    q1.emplace(std::make_unique<MyStruct>(10));
    std::deque<std::unique_ptr<MyStruct>> q2;
    q2.push_back(q1.top()); // <- compiler error "attempting to reference a deleted function"
    q2.push_back(std::move(q1.top())); // <- compiler error "attempting to reference a deleted function"
    q1.pop();
}

最佳答案

制作自己的堆。所有的堆函数都已经在<algorithm> header 中。

std::vector<std::unique_ptr<MyStruct>> q1;

auto push = [&q1](std::unique_ptr<MyStruct> p) {
    q1.push_back(std::move(p));
    std::push_heap(q1.begin(), q1.end());
};

auto pop = [&q1]() {
    std::pop_heap(q1.begin(), q1.end());
    auto result = std::move(q1.back());
    q1.pop_back();
    return result;
};

push(std::make_unique<MyStruct>(10));
std::deque<std::unique_ptr<MyStruct>> q2;
q2.push_back(pop());

关于c++ - 如何从unique_queue中提取unique_ptr并维护所有权语义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46994504/

10-11 17:53