您的位置:首页 > 编程语言 > C语言/C++

【C++ STL学习之六】STL算法之for_each

2012-04-23 20:25 721 查看
for_each()函数将调用者提供的操作施加于每一个元素身上。它既可以是非变动性算法,也可以说是变动性算法。

template <class InputIterator, class Function>
   Function for_each (InputIterator first, InputIterator last, Function f);


将函数f施加于区间[first,last)的每一个元素身上。其实现:

template<class InputIterator, class Function>
  Function for_each(InputIterator first, InputIterator last, Function f)
  {
    for ( ; first!=last; ++first ) f(*first);
    return f;
  }
它返回f已在算法内部变动过的一个副本。

f可以是普通函数,也可是仿函数。它的任何返回值都将被忽略。

程序实例:

下面的例子实现了两个功能:

一是使用普通函数print()打印所以元素;而是使用自定义的仿函数来改变每个元素:将每个元素乘以3.

main.cpp:

#include "algostuff.h"

using namespace std;

void print(int elem)
{
	cout << elem << " ";
}

//define a functor
//multiply every element with the value initialized
template <class T>
class MultiplyValue{
private:
	T value;
public:
	MultiplyValue(const T val):value(val){}

	//the function call
	void operator()(T &elem)
	{
		elem *= value;
	}
};

int main()
{
	vector<int> intVec;
	INSERT_ELEMENTS(intVec,1,9);

	cout << "elements : " << endl;
	for_each(intVec.begin(),intVec.end(),print);
	cout << endl << endl;

	for_each(intVec.begin(),intVec.end(),MultiplyValue<int>(3));
	PRINT_ELEMNTS(intVec,"after multiply : ");
	cout << endl;
}
algostuff.h:

#ifndef ALGOSTUFF_H
#define ALGOSTUFF_H

#include <iostream>
#include <vector>
#include <list>
#include <deque>
#include <set>
#include <map>
#include <string>
#include <algorithm>
#include <functional>
#include <numeric>

//print all the elements
template <class T>
inline void PRINT_ELEMNTS(const T &col,const char *optcstr = " ")
{
	typename T::const_iterator pos;
	cout << optcstr;
	for(pos = col.begin();pos != col.end();++pos)
		cout << *pos << " ";
	cout << endl;
}

//insert values from first to last into the collection
template <class T>
inline void INSERT_ELEMENTS(T &col,int first,int last)
{
	for(int i = first;i <= last;++i)
		col.insert(col.end(),i);
}

#endif
运行结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: