const std :: unordered_map <char,int =“”>'as'this'参数丢弃lambda中的限定符

时间:2017-05-17 08:25:34

标签: c++ lambda

我现在根据字符的频率按递减顺序对字符串进行排序。例如:输入是“apple”,我必须输出“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;}

它有效。

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

1 个答案:

答案 0 :(得分:2)

默认情况下,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 stdisn't nice)。我会厌倦使用map作为变量名。