我应该使用 std::for_each 吗?
我一直在尝试更多地了解我使用的语言(不同的风格、框架、模式等).我注意到我从不使用 std::for_each
所以我想也许我应该开始了.在这种情况下,我的目标是扩展我的思维,不是在某些方面(可读性、表达性、紧凑性等)改进代码.
I'm always trying to learn more about the languages I use (different styles, frameworks, patterns, etc). I've noticed that I never use std::for_each
so I thought that perhaps I should start. The goal in such cases is to expand my mind and not to improve the code in some measure (readability, expressiveness, compactness, etc).
因此,考虑到这种情况,将 std::for_each
用于简单任务(例如打印矢量)是个好主意:
So with that context in mind, is a good idea to use std::for_each
for simple tasks like, say, printing out a vector:
for_each(v.begin(), v.end(), [](int n) { cout << n << endl; }
([](int n)
是一个 lambda 函数).而不是:
(The [](int n)
being a lambda function). Instead of:
for(int i=0; i<v.size(); i++) { cout << v[i] << endl; }
我希望这个问题看起来没有意义.我想这几乎是在问一个更大的问题......中级程序员是否应该使用语言功能,即使他在此时并不真正需要,但只是为了他可以更好地理解该功能实际上可能从中受益的时间.虽然这个更大的问题可能已经被问过(例如 这里).
I hope this question doesn't seem pointless. I guess it almost asks a larger question... should an intermediate programmer use a language feature even though he doesn't really need to at this time but just so that he can understand the feature better for a time that may actually greatly benefit from it. Although this larger question has probably already been asked (e.g. here).
推荐答案
使用 std::for_each
而不是老式的 for
循环(或即使是新奇的 C++0x range-for
循环):您可以查看语句的第一个单词,您就知道该语句的确切作用.
There is an advantage to using std::for_each
instead of an old school for
loop (or even the newfangled C++0x range-for
loop): you can look at the first word of the statement and you know exactly what the statement does.
当您看到 for_each
时,您就知道 lambda 中的操作对范围内的每个元素只执行一次(假设没有抛出异常).在处理每个元素之前不可能提前退出循环,也不可能跳过元素或多次评估一个元素的循环体.
When you see the for_each
, you know that the operation in the lambda is performed exactly once for each element in the range (assuming no exceptions are thrown). It isn't possible to break out of the loop early before every element has been processed and it isn't possible to skip elements or evaluate the body of the loop for one element multiple times.
使用 for
循环,您必须阅读循环的整个主体才能知道它的作用.它可能有 continue
、break
或 return
语句来改变控制流.它可能有修改迭代器或索引变量的语句.如果不检查整个循环,就无法知道.
With the for
loop, you have to read the entire body of the loop to know what it does. It may have continue
, break
, or return
statements in it that alter the control flow. It may have statements that modify the iterator or index variable(s). There is no way to know without examining the entire loop.
Herb Sutter 讨论了使用算法和 lambda 表达式的优势 在最近向西北 C++ 用户组进行的演示中.
Herb Sutter discussed the advantages of using algorithms and lambda expressions in a recent presentation to the Northwest C++ Users Group.
请注意,如果您愿意,您实际上可以在此处使用 std::copy
算法:
Note that you can actually use the std::copy
algorithm here if you'd prefer:
std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "
"));
相关文章