在c++中定義了一個謂詞函數:compare,用在sort函數中。但如果我將compare寫在主函數中,在編譯階段編譯器(我用的是VS2010)會報錯,提示error C2601: “compare”: 本地函數定義是非法的。將函數定義在外部就運行正常。想問一下這是為什么。錯誤程序如下:#include <iostream>#include <map>#include <string>#include <vector>#include <algorithm>using namespace std;//typedef map<string, int>::const_iterator map_it;//定義謂詞//bool compare(const map_it& lit,const map_it& rit){// return lit->second < rit->second;// }int main(){
string s;
map<string, int> counters;
typedef map<string, int>::const_iterator map_it; bool compare(const map_it& lit,const map_it& rit){ return lit->second < rit->second;
} while(cin >> s){
++counters[s];
}
//將map iterator存入vector,進行排序
vector<map_it> itvec; for(map_it it = counters.begin(); it != counters.end(); ++it){
itvec.push_back(it);
} sort(itvec.begin(),itvec.end(),compare); for(vector<map_it>::const_iterator vit = itvec.begin(); vit != itvec.end(); ++vit)
{
cout<<(*vit)->first<<" occurs "<<(*vit)->second<<" times"<<endl;
} return 0;
}
1 回答

寶慕林4294392
TA貢獻2021條經驗 獲得超8個贊
函數中定義函數是非法的,你可以:
將函數定義在外部;
在函數中,定義一個Functor (需要在函數中定義一個接口體或類, 其實屬于擴展語法,但是主流編譯器都支持);
使用lambda (C++11, VS2010要打上SP1補丁)。
使用Functor:
struct { bool operator() (const map_it& lit, const map_it& rit) { return lit->second < rit->second; } } compare;
使用lambda:
auto compare = [] (const map_it& lit, const map_it& rit) -> bool { return lit->second < rit->second; };
PS: 可以簡寫為:
auto compare = [] (const map_it& lit, const map_it& rit) { return lit->second < rit->second; };
PPS:如果謂詞函數其它地方用不上,并且謂詞函數很簡短:
sort(itvec.begin(), itvec.end(), [] (const map_it& lit, const map_it& rit) { return lit->second < rit->second; });
- 1 回答
- 0 關注
- 239 瀏覽
添加回答
舉報
0/150
提交
取消