FGH*_*GHP 2 c++ std priority-queue
如何清除priority_queue使用用户定义的比较?
从std::priority_queue文档priority_queue中,我减少了我需要的情况的使用(=带有用户定义比较的队列)
>> cat test.cpp \n#include <functional>\n#include <queue>\n#include <vector>\n#include <iostream>\n#include <utility>\n\nauto queue_cmp = [](std::pair<int, double> const& lhs,\n std::pair<int, double> const& rhs) {\n return lhs.second > rhs.second; // Custom order.\n};\ntypedef std::priority_queue<std::pair<int, double>,\n std::vector<std::pair<int, double>>,\n decltype(queue_cmp)> custom_queue;\n\ntemplate<typename T>\nvoid print_queue(T q) { // NB: pass by value so the print uses a copy\n int s = 0;\n while(!q.empty()) {\n std::pair<int, double> elem = q.top();\n std::cout << s << ": " << elem.first << ", " << elem.second << std::endl;\n q.pop();\n s++;\n }\n std::cout << \'\\n\';\n}\n\nint main() {\n custom_queue q(queue_cmp);\n for (int n = 10; n < 20; n++) {\n double val = static_cast <double>(rand())/(static_cast<double>(RAND_MAX));\n q.push(std::pair<int, double>(n, val));\n }\n print_queue(q);\n //q = custom_queue(queue_cmp);\n}\nRun Code Online (Sandbox Code Playgroud)\n这运行正常
\n>> g++ -o test test.cpp \n\n>> ./test \n0: 15, 0.197551\n1: 18, 0.277775\n2: 16, 0.335223\n3: 11, 0.394383\n4: 19, 0.55397\n5: 17, 0.76823\n6: 12, 0.783099\n7: 13, 0.79844\n8: 10, 0.840188\n9: 14, 0.911647\n\nRun Code Online (Sandbox Code Playgroud)\n现在我需要重置q,按照优先级队列清除方法,我取消注释test.cpp...中的最后一行,并得到此编译错误,就好像我正确理解了一样,复制构造函数在 lamdba 上被删除:
>> g++ -o test test.cpp \ntest.cpp: In function \xe2\x80\x98int main()\xe2\x80\x99:\ntest.cpp:34:31: error: use of deleted function \xe2\x80\x98std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >& std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >::operator=(std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >&&)\xe2\x80\x99\n 34 | q = custom_queue(queue_cmp);\n | ^\nIn file included from /usr/include/c++/12/queue:64,\n from test.cpp:2:\n/usr/include/c++/12/bits/stl_queue.h:498:11: note: \xe2\x80\x98std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >& std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >::operator=(std::priority_queue<std::pair<int, double>, std::vector<std::pair<int, double> >, <lambda(const std::pair<int, double>&, const std::pair<int, double>&)> >&&)\xe2\x80\x99 is implicitly deleted because the default definition would be ill-formed:\n 498 | class priority_queue\n | ^~~~~~~~~~~~~~\n/usr/include/c++/12/bits/stl_queue.h:498:11: error: use of deleted function \xe2\x80\x98<lambda(const std::pair<int, double>&, const std::pair<int, double>&)>&<lambda(const std::pair<int, double>&, const std::pair<int, double>&)>::operator=(const<lambda(const std::pair<int, double>&, const std::pair<int, double>&)>&)\xe2\x80\x99\ntest.cpp:7:19: note: a lambda closure type has a deleted copy assignment operator\n 7 | auto queue_cmp = [](std::pair<int, double> const& lhs,\n | ^\n\nRun Code Online (Sandbox Code Playgroud)\nq这种情况有办法重置吗?
编辑
\n\nbool queue_cmp(std::pair<int, double> const& lhs,\n std::pair<int, double> const& rhs) {\n return lhs.second > rhs.second; // Custom order.\n};\n\n\nRun Code Online (Sandbox Code Playgroud)\n没有帮助
\n| 归档时间: |
|
| 查看次数: |
189 次 |
| 最近记录: |