所以我正在玩一些C ++ 11的功能,我很好奇为什么std :: for_each是有益的。做一个for循环会不会更简单,看起来更干净,还是因为我习惯这样做?
#include <iostream>
#include <tuple>
#include <vector>
#include <algorithm>
typedef std::tuple<int, int> pow_tuple;
pow_tuple pow(int x)
{
return std::make_tuple(x, x*x);
}
void print_values(pow_tuple values)
{
std::cout << std::get<0>(values) << "\t" << std::get<1>(values) << std::endl;
}
int main(int argc, char** argv)
{
std::vector<int> numbers;
for (int i=1; i < 10; i++)
numbers.push_back(i);
std::for_each(numbers.begin(), numbers.end(),
[](int x) { print_values(pow(x)); }
);
std::cout << "Using auto keyword:" << std::endl;
auto values = pow(20);
print_values(values);
return 0;
}
答案 0 :(得分:8)
标准算法正确处理所有循环问题,减少了产生一次性错误等的可能性,使您可以专注于计算而不是循环。
答案 1 :(得分:4)
它在某种程度上取决于本地编码约定,但有两种
潜在的优势。首先是它清楚地说明了代码
迭代序列中的所有元素;除非当地人
编码惯例说不然(并且它们是强制执行的),你必须这样做
考虑到一些牛仔程序员可能已插入break
。该
第二是它命名你在每个上执行的操作
元件;这个曾经很容易通过调用函数来处理
循环,当然,真正琐碎的操作可能不需要名称。
还有一个优势,至少如果你还没有使用C ++ 11那么 你不必拼写迭代器类型;拼写出来的迭代器 类型创造了大量的措辞,其中重要的逻辑可以得到 丢失或被忽视。
答案 2 :(得分:2)
可以说这个表单允许你编写这段代码而没有不必要的索引来操纵和犯错。
它也是一种存在于其他语言中的习惯用法,由于你获得了匿名函数,这个特性可以作为更高级函数的一个很好的例子(教育目的?)。
我同意它不像c ++ ......