2011-11-02 58 views
4

可能重复:
Advantages of std::for_each over for loop为什么在for循环中使用std :: for_each?

所以我用一些C++ 11个功能玩弄,我很好奇,为什么的std :: for_each的是有益的。难道它不会更容易,看起来更干净吗?还是因为我习惯这样做?

#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

的foreach的要点循环是看更整洁和更容易为人类比其解释为(;;)同行。虽然 – Akron

+0

正在研究C++ 11功能,但我个人偏向于定期循环。我将在循环中使用auto关键字,并开始(数字)/结束(数字)。使其更加兼容不同类型的数据类型。 – inf

回答

3

它在某种程度上取决于本地编码惯例,但有两个潜在的优点。第一个是它清楚地陈述代码 迭代序列中的所有元素;除非当地 编码约定另有说明(并且强制执行),否则您必须 认为某个牛仔程序员可能已插入break。 秒是它命名您在每个 元素上执行的操作;这一次可以通过调用 循环中的函数来轻松处理,当然,真正微不足道的操作可能不需要名称。

还有一个好处,至少如果您还没有使用C++ 11,那么您不必拼写出迭代器类型;拼写出来的迭代器类型会产生大量的错误,其中重要的逻辑可能会丢失或忽略。

7

标准算法处理所有的循环问题的正确,减少使得一次性错误,这样,让您专注于计算,而不是循环的机会。

+1

+1。编写与STL算法一起工作的代码,可以对循环体进行单独测试,从而减少所需的测试总数(http://stackoverflow.com/questions/588700/programmer-productivity-with-stl-vs-custom-utility - 班/ 590124#590124)。 –

1

人们可以说,这种形式可以让你编写这段代码而不需要不必要的索引来操作和出错。

它也是一种成语,存在于其他语言中,并且由于您获得了匿名函数,因此此功能可以是较高级别函数(教育目的?)的一个好例子。

我同意它不觉得像C++ ...

相关问题