【问题标题】:Why use std::for_each over a for loop? [duplicate]为什么在 for 循环中使用 std::for_each? [复制]
【发布时间】:2011-12-20 14:30:12
【问题描述】:

可能重复:
Advantages of std::for_each over for loop

所以我在玩一些 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 循环
  • 查看 c++11 功能我会在循环中使用 auto 关键字和 begin(numbers)/end(numbers)。使其更兼容不同类型的数据类型。

标签: c++ c++11


【解决方案1】:

可以说,这种形式允许您编写这段代码,而无需使用不必要的索引来操作和出错。

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

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

【讨论】:

    【解决方案2】:

    这在一定程度上取决于当地的编码约定,但有两种 潜在优势。首先是它清楚地说明了代码 遍历序列中的所有元素;除非当地 编码约定另有说明(并且它们是强制执行的),您必须 考虑到一些牛仔程序员可能插入了break。这 第二个是它命名您对每个执行的操作 元素;这一次可以通过调用中的函数轻松处理 循环,当然,真正琐碎的操作可能不需要名称。

    还有一个优点,至少如果你还没有使用 C++11,那就是 您不必拼出迭代器类型;拼出的迭代器 类型创造了很多废话,其中重要的逻辑可以得到 丢失或被忽视。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      猜你喜欢
      • 2012-08-10
      • 1970-01-01
      • 2011-06-12
      • 2019-01-09
      • 2011-04-21
      • 1970-01-01
      • 2022-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多