#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");
}