为了账号安全,请及时绑定邮箱和手机立即绑定

难道谓词函数必须在主函数外面定义吗?还有什么函数需要定义在主函数外?

难道谓词函数必须在主函数外面定义吗?还有什么函数需要定义在主函数外?

C++
www说 2023-04-25 19:15:08
在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个赞

函数中定义函数是非法的,你可以:

  1. 将函数定义在外部;

  2. 在函数中,定义一个Functor (需要在函数中定义一个接口体或类, 其实属于扩展语法,但是主流编译器都支持);

  3. 使用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;
});
查看完整回答
反对 回复 2023-04-28
  • 1 回答
  • 0 关注
  • 110 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信