【问题标题】:Ranged-based for loop over array within function函数内基于范围的for循环数组
【发布时间】:2021-03-11 13:18:50
【问题描述】:

我对 C++ 很陌生,现在边做边学。在课堂材料中,我有以下功能:

std::vector<std::complex<double>> material::get_idx(const std::vector<double>& numbers) {

  std::vector<std::complex<double>> res;

  for (auto& num : numbers) {
    // calculate with num (we don't modify it) and push_back to res 
    ...
  }

  return res;
}

几分钟前,我使用了这样的普通 for 循环:for(size_t i=0; i&lt;numbers.size(); i++)。因为我已经读到使用基于范围的 for 循环和 auto 比普通的 for 循环更有效,所以我改变了它。现在我问自己,用这样的参考编写基于范围的 for 循环是否正确/有意义/良好的做法:for(auto&amp; num : numbers) 以及使用for(auto num : numbers) 的区别是什么。我有点困惑,因为我已经在 get_idx 函数的签名中交付了每个引用的数字向量。当然,我想将每个引用的向量编号交给函数 get_idx,但是如何通过引用循环这些元素呢?

【问题讨论】:

  • 我的建议,const auto&amp; 如果你不想修改,auto&amp;&amp; 如果你想修改。
  • 嘿@NathanOliver,感谢您的回答,使用 const auto& 而不是仅使用 const auto 有什么区别?
  • 第一个是参考,所以没有复制。第二个是一个值,因此制作了一个副本。复制可能很昂贵。
  • 在 C++ 中学习的新东西永远不会用完,尽管我并不总是确定这是否是一件好事 ;)
  • 好吧,至少确保这里的人们能够自愿解释事情是一件好事。再次感谢,祝大家有美好的一天!

标签: c++ loops for-loop reference


【解决方案1】:

auto 进行复制,auto&amp; 进行任何类型的左值引用,但不会绑定到右值,auto const&amp;const 进行左值引用,可以绑定到右值并导致引用生命周期延长,@ 987654325@ 生成一个转发引用,它可以绑定到任何东西并可以导致引用生命周期延长。 auto const 制作副本并使其不可变。

哪个更正确取决于您想要哪个。

您可以只输入double const&amp;double constdouble,而不是与auto 有任何关系。

我以auto&amp;&amp; 开头,这是“我不在乎,只是让它工作”的简写。接下来我将使用auto,因为值使推理更容易。如果我担心说清楚我不是在编辑,auto constauto const&amp;

如果我想就地编辑元素,auto&amp;

【讨论】:

  • 它的 for(double const&amp; num : numbers) 而不是 for(std::complex&lt;double&gt; const&amp; num : numbers)
猜你喜欢
  • 2013-04-01
  • 1970-01-01
  • 2014-12-04
  • 1970-01-01
  • 1970-01-01
  • 2016-10-31
  • 1970-01-01
相关资源
最近更新 更多