天天看點

C++ STL 中有關于for_each() 和 transform() 算法

#include<iostream>
using namespace std;

#include"functional"   //預定義函數對象的函數實作都寫在這個庫檔案當中
#include"string"
#include<vector>
#include<list>
#include<algorithm>
#include"set"

//普通的列印輸出 采用函數模闆
template<typename T >

void printfVec(T &v1)
{
	for (T::iterator it = v1.begin(); it != v1.end(); it++)
	{
		cout << *it << " ";
	}
	cout << endl;
}

//回調函數
void showElemt(int &n)
{
	n=n + 1;
	cout << n << " ";
}

//函數對象
class C_ShowElemt
{
public:
	C_ShowElemt()
	{
		num = 0;
	}
	void operator()(int &n)
	{
		num++;
		cout << n << " ";
	}

public:
	int num;

};


//有關for_each() 和 transform() 算法的使用
void main41()
{
	vector<int> m_vec;

	m_vec.push_back(1);
	m_vec.push_back(3);
	m_vec.push_back(5);

	//使用for_each() 實作對這個容器的周遊  同時可以做到對容器元素的修改 本身就是一種可變值算法

	//1 采用一個回調函數 回調函數的入口位址
	for_each(m_vec.begin(), m_vec.end(), showElemt);
	cout << endl;

	//2 采用函數對象 并且for_each()的傳回值也是一個函數對象

	for_each(m_vec.begin(), m_vec.end(), C_ShowElemt());
	cout << endl;

	//之前提過使用用類封裝的函數對象可以實作記錄狀态 并且利用其傳回值是一個類對象

	C_ShowElemt m_show = for_each(m_vec.begin(), m_vec.end(), C_ShowElemt());
	cout << " 記錄調用的次數:" << m_show.num << endl;



}


//回調函數
int increase(int &a)
{
   return a + 100;
}


//有關于 transform()算法的使用
void main42()
{
	vector<int> m_vec;

	m_vec.push_back(1);
	m_vec.push_back(3);
	m_vec.push_back(5);

	printfVec<vector<int>>(m_vec);

	//回調函數的方法
	//周遊m_vec 再将值穿入 m_vec當中 并且采用回調函數實作值加100
	transform(m_vec.begin(), m_vec.end(), m_vec.begin(), increase);
	printfVec<vector<int>>(m_vec);

	//使用預定義的函數對象  negate<int>() 實作所有值變為負數
	transform(m_vec.begin(), m_vec.end(), m_vec.begin(), negate<int>());
	printfVec<vector<int>>(m_vec);

	//将容器中的值乘以十  并且放到連結清單當中
	list<int> myList;
	myList.resize(3);
	transform(m_vec.begin(), m_vec.end(), myList.begin(), bind2nd(multiplies<int>(),10));
	printfVec<list<int>>(myList);
	
	//将結果直接輸出到螢幕上  使用輸出流的疊代器
	transform(m_vec.begin(), m_vec.end(), ostream_iterator<int>(cout ," " ), negate<int>());
}

void main()
{
	//main41();//有關for_each() 算法的使用
	main42(); //有關于 transform()算法的使用
	system("pause");

}
           
c++

繼續閱讀