STL中遍历算法:for_each和transform

for_each()

  • for_each:  用指定函数依次对指定范围内所有元素进行迭代访问。该函数不得修改序列中的元素。

void show(const int &iItem)

{

        cout << iItem;

}

main()

{

        int iArray[] = {0,1,2,3,4};

        vector<int> vecInt(iArray,iArray+sizeof(iArray)/sizeof(iArray[0]));

    for_each(vecInt.begin(), vecInt.end(), show);

 

//结果打印出0 1 2 3 4

}

 

transform()

  • transform:   与for_each类似,遍历所有元素,但可对容器的元素进行修改,如果接收输出结果的容器与原输入容器一致,那么transform跟for_each可以理解为是一样。transform可以将一个容器内的内容变化为另一个容器的内容,也可以将两个容器内的内容变换为一个容器中的内容。

int increase (int i) 

        return i+1;  

 

main()

                 {

                         vector<int> vecIntA;

                         vecIntA.push_back(1);

                         vecIntA.push_back(3);

                         vecIntA.push_back(5);

                         vecIntA.push_back(7);

                         vecIntA.push_back(9);

 

 

                         transform(vecIntA.begin(),vecIntA.end(),vecIntA.begin(),increase);             //vecIntA : {2,4,6,8,10}

                 }

 

具体可以看如下代码:

#include <iostream>
using namespace std;

#include "string"
#include <vector>
#include <list>
#include "set"
#include <algorithm>
#include "functional"
#include "iterator"  //输出流迭代器的头文件


void printV(vector<int> &v)
{
	for (vector<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
}


void printList(list<int> &v)
{
	for (list<int>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << *it << " ";
	}
}


void showElem(int& n)
{
	cout << n << " ";
}

class CMyShow
{
public:
	CMyShow()
	{
		num = 0;
	}
	void operator()(int& n)
	{
		num++;
		cout << n << " ";
	}

	void printNum()
	{
		cout << " num: " << num << endl;
	}

protected:
private:
	int num;
};



void main_for_each()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);
	cout << endl;

	//用回调函数调用,传递的是回调函数的入口地址
	cout << "用回调函数调用" << endl;
	for_each(v1.begin(),v1.end(),showElem);
	cout << endl;
	
	cout << "用函数对象来调用" << endl;
	for_each(v1.begin(),v1.end(),CMyShow());
	cout << endl;


	CMyShow mya;
	CMyShow my1 = for_each(v1.begin(), v1.end(), mya); //给my1初始化
	mya.printNum();  //ma1和my1 是两个不同的对象,这里输出: 0
	my1.printNum();  //这里输出: 3

	my1 = for_each(v1.begin(), v1.end(), mya);  //给my1赋值
	my1.printNum();  //这里输出3

}


int increase(int i)
{
	return i + 100;
}


void main()
{
	vector<int> v1;
	v1.push_back(1);
	v1.push_back(3);
	v1.push_back(5);

	printV(v1);  //输出  1,3,5
	cout << endl;

	//transform使用回调函数
	transform(v1.begin(), v1.end(), v1.begin(), increase);
	printV(v1);  //输出: 101,103,105
	cout << endl;


	//transform使用 函数适配器 和 函数对象
	list<int> mylist;
	mylist.resize(v1.size());

	transform(v1.begin(), v1.end(), mylist.begin(), bind2nd(multiplies<int>(), 10));
	printList(mylist);  //输出: 1010,1030,1050
	cout << endl;


    //transform 也可以把运算结果 直接输出到屏幕
	transform(v1.begin(), v1.end(), ostream_iterator<int>(cout, " " ), negate<int>() );
	cout << endl;

}
发布了293 篇原创文章 · 获赞 113 · 访问量 25万+

猜你喜欢

转载自blog.csdn.net/tianguiyuyu/article/details/105612159