function object研究之一

本文深入探讨了C++中FunctionObject的概念及其在函数调用中的应用,通过for_each函数的实例展示了如何使用FunctionObject进行序列操作。详细解析了FunctionObject的实现方式以及对STL设计的影响,强调了FunctionObject在避免性能和内存开销方面的最佳实践。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概念

Function object首先是一个类,它实现了函数调用操作符T operator()(T), T可以是void类型。

最简单的示例:for_each


class A{ public: A():x_(0){ } void operator()(int x){ cout<<++x_<<endl; } int x() const{ return x_; } private: int x_; }; /* * */ int main(int argc, char** argv) { vector<int> v; v.push_back(1); v.push_back(2); A a; for_each(v.begin(),v.end(),a); cout<<a.x()<<endl; return 0; }

输出结果是:
1
2
0

for_each的实现

通过查看for_each的源代码,可以观察到stl中使用function object的基本特征。下面是gcc4.6.1的实现代码:


/** * @brief Apply a function to every element of a sequence. * @ingroup non_mutating_algorithms * @param first An input iterator. * @param last An input iterator. * @param f A unary function object. * @return @p f (std::move(@p f) in C++0x). * * Applies the function object @p f to each element in the range * @p [first,last). @p f must not modify the order of the sequence. * If @p f has a return value it is ignored. */ template<typename _InputIterator, typename _Function> _Function for_each(_InputIterator __first, _InputIterator __last, _Function __f) { // concept requirements __glibcxx_function_requires(_InputIteratorConcept<_InputIterator>) __glibcxx_requires_valid_range(__first, __last); for (; __first != __last; ++__first) __f(*__first); return _GLIBCXX_MOVE(__f); }
for_each通过值传递复制外面传过来的function object,然后每次将容器中的一个元素作为参数交给function object的函数调用操作,最后将function object返回,又会导致一次拷贝。对于STL的设计,一般都是采用这种方式,所以要求function object不能禁止拷贝操作,而且要尽量小,防止造成较大的性能和内存成本。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值