2017-05-17 81 views
1

我現在正在按照字符的頻率降序排序字符串。例如:輸入是「蘋果」,我必須輸出「ppale」。因爲字符'p'出現兩次而其他字符只出現一次。所以'p'必須放在最左邊。const std :: unordered_map <char, int>'as'this'參數丟棄lambda中的限定符

這裏是我的代碼:

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

Nit挑選這裏:顯然,你*可能*有一個'使用命名空間std'在你的代碼中的某個地方。我會厭倦使用'map'作爲變量名 – WhiZTiM

回答

2

默認情況下,拉姆達的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(其中isn't nice)。我會厭倦使用map作爲變量名稱。

+0

yap,'sort'和'unordered_map'來自'std',我有一個'using namespace std'。感謝您的建議! – Sheng

相關問題