【问题标题】:for_each function in c++11c++11中的for_each函数
【发布时间】:2023-03-29 10:50:01
【问题描述】:

我有一个用 5 个数字填充的整数向量,我很好奇 [&idx] 到底做了什么:

int idx = 0;
for_each ( x . begin (), x . end (), [&idx] ( const int & a ) { cout << idx ++ << " " << a << endl; } );`

为什么它不能这样工作? :

int idx = 0;
  for_each ( x . begin (), x . end (), ( const int & a, int & idx ) { cout << idx ++ << " " << a << endl; } );

从性能的角度来看是不是更好? :

for ( vector<int>::size_type i = 0; i < x . size (); i ++ )
    cout << x[i] << endl;

【问题讨论】:

  • 另外,你的第二个代码块有错误的语法。即使没有捕获列表,Lambda 仍然需要 []

标签: c++ c++11 vector foreach


【解决方案1】:

我很好奇 [&amp;idx] 到底做了什么

这就是 lambda 捕获。它将 lambda 设置为引用 idx。它不能作为参数工作,因为for_each 只将一个参数传递给谓词。如果您将 idx 设为参数,则无法编译。

从性能的角度来看是不是更好?

可能。如果您真的想知道,请测试每种方法。

【讨论】:

    【解决方案2】:

    [&idx] 究竟做了什么

    [](){}
    

    结构,从 C++11 开始,是一个 lambda 函数 - 即,一个匿名函数,在这种情况下,将使用作为参数传递的向量元素进行回调。 [&amp;idx] 表示变量 idx 通常不属于 lambda 的环境并且后者通常无法访问,而应该可以通过引用在其中访问(捕获)。这意味着您可以在 lambda 的主体中使用idx,并且无论何时这样做,您都在使用对原始变量的引用。因此,代码的idx++ 部分增加了原始的idx 变量,而不是一些本地副本。

    为什么它不能这样工作?

    因为() {} 结构不是有效的 C++ 表达式或语句。

    从性能的角度来看是不是更好? :

    可能但不一定,您应该进行测量以确定。然而,使用迭代器和算法而不是 C 风格的循环是可取的和惯用的。鉴于标准的“避免过早优化”指南,我建议您默认使用第一个版本,当您完成所有开发后,您可以决定是否要花一些时间来试用和衡量替代方案,例如第二个.如果这不在您程序的某些关键部分(例如在某些回调函数中),我认为它不值得大惊小怪,反正差异会很小。

    仅供参考,在我的系统中,使用带有-O3 标志的clang++,您的std::foreach 版本的1000 次迭代将持续4967 毫秒,而for 的1000 次迭代将持续3861 毫秒。 1000 次迭代大约需要 1 秒,例如如果您只运行此代码一次,则为 1 毫秒..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 2011-06-30
      • 1970-01-01
      • 2012-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多