如何清除使用用户定义比较的“priority_queue”?

FGH*_*GHP 2 c++ std priority-queue

如何清除priority_queue使用用户定义的比较?

\n

std::priority_queue文档priority_queue中,我减少了我需要的情况的使用(=带有用户定义比较的队列)

\n
>> 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}\n
Run 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\n
Run Code Online (Sandbox Code Playgroud)\n

现在我需要重置q,按照优先级队列清除方法,我取消注释test.cpp...中的最后一行,并得到此编译错误,就好像我正确理解了一样,复制构造函数在 lamdba 上被删除:

\n
>> 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\n
Run Code Online (Sandbox Code Playgroud)\n

q这种情况有办法重置吗?

\n

编辑

\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\n
Run Code Online (Sandbox Code Playgroud)\n

没有帮助

\n

Nic*_*las 5

C++17 中没有。

C++20 为无捕获 lambda 提供了默认构造函数。但在早期的语言版本中,构造函数被删除。

确实,您不应该使用 lambda。只需使用命名结构即可。