STL之for_each的显式使用问题

scut_lcc 2010-08-05 08:05:12
函数声明

void print(int foo);


调用STL的for_each()算法;

for_each( vi.begin(), vi.end(), test );

其中vi为vector<int>


这个是for_each()的声明:

template<class _InIt, class _Fn1>

inline _Fn1 for_each(_InIt _First, _InIt _Last, _Fn1 _Func);


我的问题是:调用for_each( vi.begin(), vi.end(), test )时,_Fn1 这个类型是什么?

如果想要显式调用for_each,可以吗?该怎么做
...全文
324 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
linsen_519 2010-08-06
  • 打赏
  • 举报
回复
函数对象啊
wjb_yd 2010-08-06
  • 打赏
  • 举报
回复
别忘了,函数指针也是一个类型~
当然了,仿函数才是一个实实在在的class~
jamseyang 2010-08-06
  • 打赏
  • 举报
回复
学习了。。。
scut_lcc 2010-08-06
  • 打赏
  • 举报
回复
喔野,谢谢,搞定收工,结贴
mstlq 2010-08-06
  • 打赏
  • 举报
回复
typedef void(*F)(int);
for_each< vector<int>::iterator, F >( vi.begin(), vi.end(), test );
taodm 2010-08-06
  • 打赏
  • 举报
回复
void(*f)(int) = test;
这是什么语法?你要的是typedef
scut_lcc 2010-08-06
  • 打赏
  • 举报
回复
最后一个问题,按照大家的意见,为什么我这样显示调用

void(*f)(int) = test;
for_each< vector<int>::iterator, f >( vi.begin(), vi.end(), test );

在vs2005,会报错
error C2974: 'std::for_each' : 模板 对于 '_Fn1'是无效参数,应为类型

应怎么改?
独酌逸醉 2010-08-05
  • 打赏
  • 举报
回复
仿函数和函数指针。
Longerandlonger 2010-08-05
  • 打赏
  • 举报
回复
_Fn1 ,看你传入的参数什么类型咯,你传入一个函数名,那_Fn1就是函数指针;
你传入一个仿函数,那_Fn1就是仿函数所属的类
cranium 2010-08-05
  • 打赏
  • 举报
回复
十分关心怎么隐式调用for_each?
qq120848369 2010-08-05
  • 打赏
  • 举报
回复
随便你放一个函数指针或者函数对象,模板里的实现应该是以这个形式调用的func(_InIt::...),形参是迭代器指向的容器里的数据类型的引用,所以要求你传入函数指针或者函数对象.

具体实现我也不了解,不过你看MSDN帮助应该很详细的介绍了.
hz_yck 2010-08-05
  • 打赏
  • 举报
回复
你指类型?
例子里面是void (f*) (int);
返回值会被忽略,唯一参数的类型是*_InIt的类型
WingStone 2010-08-05
  • 打赏
  • 举报
回复
3楼正解
根据你的函数调用,应该定义test为一个函数,或者带函数调用成员的类,此时_Fn1就是该类。
推荐定义成后者,可以得到更灵活的应用,可参看
C++primer 4th
14.8. Call Operator and Function Objects
scut_lcc 2010-08-05
  • 打赏
  • 举报
回复
楼上,说到点子上了,myfunction是个函数指针,当使用函数指针时,_Fn1 是什么东东
hz_yck 2010-08-05
  • 打赏
  • 举报
回复
晕。。。我写漏了
template<class T>写成template<typename T>比较合适点。是个类型,myfunction是个函数指针,当然也可以用了。
scut_lcc 2010-08-05
  • 打赏
  • 举报
回复
天,怎么都答非所问

// for_each example
#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

void myfunction (int i) {
cout << " " << i;
}

struct myclass {
void operator() (int i) {cout << " " << i;}
} myobject;

int main () {
vector<int> myvector;
myvector.push_back(10);
myvector.push_back(20);
myvector.push_back(30);

cout << "myvector contains:";
for_each (myvector.begin(), myvector.end(), myfunction);

// or:
cout << "\nmyvector contains:";
for_each (myvector.begin(), myvector.end(), myobject);

cout << endl;

return 0;
}

这段代码俺懂,3楼说的是
for_each (myvector.begin(), myvector.end(), myobject);
这种情形。我想问的是
for_each (myvector.begin(), myvector.end(), myfunction);
这种情况。此时使用的是函数,不是类。这个时候_Fn1是什么东东
hz_yck 2010-08-05
  • 打赏
  • 举报
回复
_Fn1是重载了()运算符的类

http://www.cplusplus.com/reference/algorithm/for_each/
里面有两段代码,上面的代码相当于函数实现,下面是个例子
scut_lcc 2010-08-05
  • 打赏
  • 举报
回复
汗,我问的是使用函数的情形,不是仿函数
DotCpp 2010-08-05
  • 打赏
  • 举报
回复
template<class _InIt, class _Fn1>

看这句就知道了。应该是自己定义的类

64,647

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧