#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++ STL 中有关于for_each() 和 transform() 算法
最新推荐文章于 2025-03-14 22:43:34 发布