您好,匿名用户
随意问技术百科期待您的加入

C++中谓词函数要放在主函数外面吗

0 投票

在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;
}
用户头像 提问 2014年 2月15日 @ Wukong 上等兵 (475 威望)
分享到:

1个回答

0 投票
 
最佳答案

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

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

若对C++11的lambda感兴趣,请利用搜索引擎获取更多知识。
如果你想让程序有更好的兼容性,推荐使用Functor方式。

用户头像 回复 2014年 2月15日 @ Ezreal 上等兵 (266 威望)
选中 2013年 9月7日 @Wukong
提一个问题:

相关问题

0 投票
1 回复 45 阅读
0 投票
0 回复 26 阅读
0 投票
1 回复 38 阅读
0 投票
1 回复 30 阅读
用户头像 提问 2012年 12月1日 @ Varus 上等兵 (281 威望)
0 投票
0 回复 12 阅读
用户头像 提问 2014年 2月20日 @ Sagittarius 上等兵 (289 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...