const std::unordered_map<char, int>' 因为 'this' 参数会丢弃 lambda 中的限定符

const std::unordered_map<char, int>’ as ‘this’ argument discards qualifiers in lambda

本文关键字:参数 lambda this gt map unordered std lt char const int      更新时间:2023-10-16

我现在根据字符的频率按降序对字符串进行排序。例如:输入是"苹果",我必须输出"ppale"。因为字符"p"出现两次,而其他字符只出现一次。所以"P"必须放在最左边。

这是我的代码:

string frequencySort(string s) {
    if(s.size() == 0)   return "";
    unordered_map<char,int> map;
    for(auto c : s)
        map[c]++;   //record the frequency of each characters
    sort(s.begin(),s.end(),
        [=](char a, char b){return map[a] > map[b] || map[a]==map[b]&&a<b;}
        );
    return s;
}

但是编译器显示错误: passing ‘const std::unordered_map<char, int>’ as ‘this’ argument discards qualifiers [=](char a, char b){return map[a] > map[b] || map[a]==map[b]&&a<b;}.

但是,如果我通过引用捕获局部变量,即

[&](char a, char b){return map[a] > map[b] || map[a]==map[b]&&a<b;}

它有效。

谁能告诉我为什么我不能按价值捕获?

默认情况下

,lambda 的operator (...) const。按值捕获将要求 lambda 保留所有捕获对象的副本。

使 lambda mutable以允许修改值捕获。

sort(s.begin(),s.end(), [=](char a, char b) mutable 
          {return map[a] > map[b] || map[a]==map[b]&&a<b;}
    );

我怀疑sortunordered_map来自命名空间std.从您在没有命名空间解析的情况下使用它们的方式来看,您的代码中可能存在using namespace std(这并不好(。我会厌倦使用 map 作为变量名称。