首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++重用Lambda作为`std::priority_queue`中的比较函数

C++重用Lambda作为`std::priority_queue`中的比较函数
EN

Stack Overflow用户
提问于 2022-11-08 06:11:47
回答 1查看 13关注 0票数 0

在使用std::priority_queue时,我试图清除优先级队列的内容,如下所示:

代码语言:javascript
复制
#include <iostream>
#include <queue>
#include <vector>

using std::cout;
using std::priority_queue;
using std::vector;

int main() {

    const auto comp = [](int a, int b) {
        return a > b;
    };

    auto a = priority_queue<int, vector<int>, decltype(comp)>(comp);

    a.push(10);
    a.push(9);
    a.push(8);

    // 3
    cout << a.size() << '\n';

    a = priority_queue<int, vector<int>, decltype(comp)>(comp);

    // 0
    cout << a.size() << '\n';

    return 0;

}

在使用Clang编译时,我得到了一个错误:

代码语言:javascript
复制
In file included from tmp.cpp:1:
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk/usr/include/c++/v1/queue:455:39: error: no viable overloaded '='
        {c = _VSTD::move(__q.c); comp = _VSTD::move(__q.comp); return *this;}
                                 ~~~~ ^ ~~~~~~~~~~~~~~~~~~~~~
tmp.cpp:19:7: note: in instantiation of member function 'std::priority_queue<int, std::vector<int>, const (lambda at tmp.cpp:9:23)>::operator=' requested here
    a = priority_queue<int, vector<int>, decltype(comp)>(comp);
      ^
tmp.cpp:9:23: note: candidate function (the implicit copy assignment operator) not viable: 'this' argument has type 'std::priority_queue<int, std::vector<int>, const (lambda at tmp.cpp:9:23)>::value_compare' (aka 'const (lambda at tmp.cpp:9:23)'), but method is not marked const
    const auto comp = [](int a, int b) {
                      ^
1 error generated.

为什么这会给我一个错误?有什么办法可以解决吗?谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-11-08 06:27:45

decltype(comp)是一个const类型,const auto comp,它使存储comppriority_queue成员变量成为常量,因此不能重新分配。

你可能想

代码语言:javascript
复制
priority_queue<int, vector<int>, remove_cv_t<decltype(comp)>>(comp);

代码语言:javascript
复制
auto comp = [](int a, int b) {
    return a > b;
};

用于lambdas的复制赋值运算符被隐式删除。解决办法:

代码语言:javascript
复制
std::function<bool(int, int)> comp = [](int a, int b) {
    return a > b;
};
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74356368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档