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中提取出来的方法:“试图引用已删除的函数”。什么是完成此任务的正确方法?
(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