扫码关注官方订阅号
在c++中定义了一个谓词函数:compare,用在sort函数中。但如果我将compare写在主函数中,在编译阶段编译器(我用的是VS2010)会报错,提示
error C2601: “compare”: 本地函数定义是非法的。
将函数定义在外部就运行正常。 想问一下这是为什么。谓词函数必须在主函数外面定义吗?还有什么函数需要定义在主函数外? 错误程序如下:
#include #include #include #include #include using namespace std; //typedef map::const_iterator map_it; //定义谓词 //bool compare(const map_it& lit,const map_it& rit){ // return lit->second < rit->second; // } int main() { string s; map counters; typedef map::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 itvec; for(map_it it = counters.begin(); it != counters.end(); ++it){ itvec.push_back(it); } sort(itvec.begin(),itvec.end(),compare); for(vector::const_iterator vit = itvec.begin(); vit != itvec.end(); ++vit) { cout<<(*vit)->first<<" occurs "<<(*vit)->second<<" times"<
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
函数中定义函数是非法的,你可以:
使用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; });
若对C++11的lambda感兴趣,请利用搜索引擎获取更多知识。 如果你想让程序有更好的兼容性,推荐使用Functor方式。
微信扫码关注PHP中文网服务号
QQ扫码加入技术交流群
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
PHP学习
技术支持
返回顶部
函数中定义函数是非法的,你可以:
使用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; });若对C++11的lambda感兴趣,请利用搜索引擎获取更多知识。
如果你想让程序有更好的兼容性,推荐使用Functor方式。