为什么要使用 std::for_each 而不是 for 循环?

6

可能是重复问题:
使用std::for_each而不是for循环的优点

我正在尝试一些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;
}

foreach循环的主要目的是看起来更整洁,比它们的for(;;)循环对应更容易被人理解。然而,我个人倾向于使用普通的for循环。 - Akron
研究C++11的特性后,我会在循环中使用auto关键字,并使用begin(numbers)/end(numbers)使其更兼容不同类型的数据。 - Stephan Dollberg
3个回答

8

标准算法可以正确处理所有的循环问题,降低出现偶然错误的概率,让你专注于计算而不是循环。


1
编写与STL算法配合使用的代码可以使循环体得到隔离测试,从而减少所需的总测试次数(http://stackoverflow.com/questions/588700/programmer-productivity-with-stl-vs-custom-utility-classes/590124#590124)。 - Richard Corden

4
这取决于本地的编码规范,但有两个潜在的优点。第一个是它清晰地说明了代码迭代序列中的所有元素;除非本地编码规范另有规定(并得到执行),否则必须考虑一些牛仔程序员可能会插入break语句。
第二个是它命名了您在每个元素上执行的操作;此操作可以通过在循环中调用函数轻松处理,并且当然,真正微不足道的操作可能不需要名称。
如果您尚未使用C++11,则还有一个优点,那就是您无需拼写迭代器类型;拼写出的迭代器类型创建了大量冗余信息,其中重要的逻辑可能会被忽视或忽略。

2

可以说,这种形式让您无需索引即可编写此代码片段,避免了不必要的操作和错误。

这也是其他语言中存在的习语,由于您正在获取匿名函数,因此此功能可以成为高级函数的良好示例(教育目的?)。

我同意它不像c++...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接