for_each()算法的使用
2016-05-08 21:18
363 查看
for_each()算法非常灵活,允许不同方式访问、处理、修改每一个元素。
UnaryProc
1、 对区间[beg, end)中每一个元素调用:
2、 返回op的一个拷贝(副本),自C++11起,返回的op已被改动过
3、 op可以改动元素。
4、 op的任何返回值都会被忽略。
5、 复杂度:线性。调用op()共numElems次。
运行结果:
程序分析:
改动元素必须声明elem的类型为引用(reference),也必须定义lambda的capture像这样[=],为的是加“第一元素的拷贝”。
如果第二个for_each()传入引用,即把[=]换成[&],
“加数”会改变,导致以下输出:
for_each()有一个特殊性质就是它能返回其操作,我们可以利用这一特性,处理和返回“置于该操作中的结果”:
UnaryProc
for_each(InputIterator beg, InputIterator end, UnaryProc op)
1、 对区间[beg, end)中每一个元素调用:
op(elem)
2、 返回op的一个拷贝(副本),自C++11起,返回的op已被改动过
3、 op可以改动元素。
4、 op的任何返回值都会被忽略。
5、 复杂度:线性。调用op()共numElems次。
不修改元素程序实例
把每一个元素传给一个lambda,后者将它所获得的元素打印出来:#include <iostream> #include <vector> #include <algorithm> using namespace std; template <typename T> inline void insert_elems(T& coll, int first, int last) { for (int i = first; i <= last; i++) { coll.insert(coll.end(), i); } } int main() { vector<int> coll; insert_elems(coll, 1, 9); for_each(coll.begin(), coll.end(), [](int elem) { cout << elem << ' '; }); cout << endl; system("pause"); }
运行结果:
/* 1 2 3 4 5 6 7 8 9 请按任意键继续. . . */
下例示范如何改变元素
#include <iostream> #include <vector> #include <algorithm> using namespace std; template <typename T> inline void insert_elems(T& coll, int first, int last) { for (int i = first; i <= last; i++) { coll.insert(coll.end(), i); } } template <typename T> inline void print(T coll) { for (auto elem : coll) { cout << elem << ' '; } cout << endl; } int main() { vector<int> coll; insert_elems(coll, 1, 9); //每个元素+10 for_each(coll.begin(), coll.end(), [](int& elem) { elem += 10; }); print(coll); //把第一个元素的值加至每一个元素 for_each(coll.begin(), coll.end(), [=](int& elem) //=operator { elem += *coll.begin(); }); print(coll); system("pause"); }
/* 11 12 13 14 15 16 17 18 19 22 23 24 25 26 27 28 29 30 请按任意键继续. . . */
程序分析:
改动元素必须声明elem的类型为引用(reference),也必须定义lambda的capture像这样[=],为的是加“第一元素的拷贝”。
如果第二个for_each()传入引用,即把[=]换成[&],
for_each(coll.begin(), coll.end(), [&](int& elem) //=operator { elem += *coll.begin(); });
“加数”会改变,导致以下输出:
11 12 13 14 15 16 17 18 19 22 34 35 36 37 38 39 40 41 请按任意键继续. . .
利用for_each()的返回值
第三个例子展示如何利用for_each()的返回值。for_each()有一个特殊性质就是它能返回其操作,我们可以利用这一特性,处理和返回“置于该操作中的结果”:
#include <iostream> #include <vector> #include <algorithm> using namespace std; template <typename T> inline void insert_elems(T& coll, int first, int last) { for (int i = first; i <= last; i++){ coll.insert(coll.end(), i); } } class MeanValue { private: long num_; long sum_; public: MeanValue() : num_(0) , sum_(0) {} void operator()(int elem){ ++num_; sum_ += elem; } operator double(){ return static_cast<double>(sum_) / static_cast<double>(num_); } }; int main() { vector<int> coll; insert_elems(coll, 1, 8); double mv = for_each(coll.begin(), coll.end(),MeanValue()); cout << "mean value: " << mv << endl; system("pause"); }
/* mean value: 4.5 请按任意键继续. . . */
相关文章推荐
- 字符串排序(nyoj 1149)
- 仿LOL项目开发第五天
- 20145216史婧瑶《Java程序设计》第10周学习总结
- 62.JAVA编程思想——线程堵塞
- 20145216史婧瑶《Java程序设计》第五次实验报告
- html5绘制变换图形-旋转图形
- ubuntu kylin14.04 上 android 5.1.1源码下载,编译
- 20145216史婧瑶《Java程序设计》第五次实验报告
- 20150319--TP+聊天室
- 61.JAVA编程思想——共享有限资源
- M
- tomcat的几个常见问题
- HDU 5242 Game (树上贪心|类 树链剖分)
- BroadcastReceiver
- TCP数据传输(六):上传图片并给出反馈
- HDU 4496 D-City (并查集)
- 20145227 《Java程序设计》实验五实验报告
- Apache kafka 工作原理介绍(作者原创文章已发表在IBM开发者论坛)
- Android 高效加载图片
- zookeeper安装