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;
}