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

在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;
}


www说
浏览 117回答 1
1回答

宝慕林4294392

函数中定义函数是非法的,你可以:将函数定义在外部;在函数中,定义一个Functor (需要在函数中定义一个接口体或类, 其实属于扩展语法,但是主流编译器都支持);使用lambda (C++11, VS2010要打上SP1补丁)。使用Functor:struct&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;operator()&nbsp;(const&nbsp;map_it&&nbsp;lit,&nbsp;const&nbsp;map_it&&nbsp;rit)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lit->second&nbsp;<&nbsp;rit->second; &nbsp;&nbsp;&nbsp;&nbsp;} }&nbsp;compare;使用lambda:auto&nbsp;compare&nbsp;=&nbsp;[]&nbsp;(const&nbsp;map_it&&nbsp;lit,&nbsp;const&nbsp;map_it&&nbsp;rit)&nbsp;->&nbsp;bool&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lit->second&nbsp;<&nbsp;rit->second; };PS: 可以简写为:auto&nbsp;compare&nbsp;=&nbsp;[]&nbsp;(const&nbsp;map_it&&nbsp;lit,&nbsp;const&nbsp;map_it&&nbsp;rit)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lit->second&nbsp;<&nbsp;rit->second; };PPS:如果谓词函数其它地方用不上,并且谓词函数很简短:sort(itvec.begin(),&nbsp;itvec.end(),&nbsp;[]&nbsp;(const&nbsp;map_it&&nbsp;lit,&nbsp;const&nbsp;map_it&&nbsp;rit)&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;lit->second&nbsp;<&nbsp;rit->second; });
打开App,查看更多内容
随时随地看视频慕课网APP