我现在根据字符的频率按递减顺序对字符串进行排序。例如:输入是“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;}
它有效。
有谁能告诉我为什么我不能按价值捕获?
答案 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;}
);
我怀疑sort
和unordered_map
来自名称空间std
。从您使用它们而没有命名空间分辨率的方式来看,可能在您的代码中有using namespace std
(isn't nice)。我会厌倦使用map
作为变量名。