遍历算法
- for_each 可有有返回值
- 可以绑定参数进行输出
- transform 将容器中的数据进行搬运到另一个容器中
- 注意:transform 目标容器需要开辟空间
for_each(iterator beg, iterator end, _callback);
- 遍历算法 遍历容器元素
- @param beg 开始迭代器
- @param end 结束迭代器
- @param _callback 函数回调或者函数对象
- @return 函数对象
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <vector> #include <functional> #include <algorithm> //1.for_each普通遍历 struct myPrint01 { void operator()(int v) { cout << v << endl; } }; void test01() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } for_each(v.begin(), v.end(), myPrint01()); } //2.for_each可以保存内部记录 struct myPrint02 { void operator()(int v) { cout << v << endl; m_Count++; } int m_Count; }; void test02() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } //for_each做遍历的时候会返回函数对象 myPrint02 print2 = for_each(v.begin(), v.end(), myPrint02()); cout << print2.m_Count << endl; } //3.for_each可以绑定参数进行输出 struct myPrint03:public binary_function<int,int,void> { void operator()(int v, int start)const { cout << v + start << endl; } }; void test03() { vector<int>v; for (int i = 0; i < 10; i++) { v.push_back(i); } for_each(v.begin(), v.end(), bind2nd(myPrint03(), 1000)); }
transform(iterator beg1, iterator end1, iterator beg2, _callbakc)
- transform算法 将指定容器区间元素搬运到另一容器中
- 注意 : transform 不会给目标容器分配内存,所以需要我们提前分配好内存
- @param beg1 源容器开始迭代器
- @param end1 源容器结束迭代器
- @param beg2 目标容器开始迭代器
- @param _cakkback 回调函数或者函数对象
- @return 返回目标容器迭代器
#define _CRT_SECURE_NO_WARNINGS #include <iostream> using namespace std; #include <vector> #include <algorithm> #include <functional> //1.搬运 把一个容器内的数据搬运到另一个容器中 struct Transform { int operator()(int v) { return v + 10; //搬运过程中给源容器每个数据+10 } }; void test01() { vector<int>v; //源容器 for (int i = 0; i < 10; i++) { v.push_back(i); } vector<int> vTarget;//目标容器 vTarget.resize(v.size()); //重要 一定要给目标容器分配内存 transform(v.begin(), v.end(), vTarget.begin(), Transform()); //搬运的同时修改每个成员的值 for_each(vTarget.begin(), vTarget.end(), [](int v) { cout << v << endl; }); } //2.把两个容器内的数据 一起搬运到第三个容器内 可以加逻辑运算 struct Transform02 { int operator()(int v1, int v2) { return v1 + v2; } }; void test02() { vector<int>v1; //源容器 vector<int>v2; //源容器 for (int i = 0; i < 10; i++) { v1.push_back(i + 100); v2.push_back(i + 200); } vector<int> vTar; //目标容器 vTar.resize(v1.size()); transform(v1.begin(), v1.end(), v2.begin(), vTar.begin(), Transform02()); for_each(vTar.begin(), vTar.end(), [](int v) {cout << v << endl; }); } int main() { test02(); //test01(); system("Pause"); return 0; }
结果: