基于C ++ 11范围的循环:按值或引用const获取项目?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (27)

读取基于范围环的一些例子他们建议两种主要方式1234

std::vector<MyClass> vec;

for (auto &x : vec)
{
  // x is a reference to an item of vec
  // We can change vec's items by changing x 
}

要么

for (auto x : vec)
{
  // Value of x is copied from an item of vec
  // We can not change vec's items by changing x
}

好。

当我们不需要更改vec项目时,IMO示例建议使用第二个版本(按值)。为什么他们没有提出任何const引用的东西(至少我没有找到任何直接的建议):

for (auto const &x : vec) // <-- see const keyword
{
  // x is a reference to an const item of vec
  // We can not change vec's items by changing x 
}

不是更好吗?它是否避免了每次迭代中的冗余副本,而这又是一个const

提问于
用户回答回答于

如果你不想更改项目以及想要避免复印,那么auto const &是正确的选择:

for (auto const &x : vec)

谁建议你使用auto &是错误的。别理他们。

这里回顾一下:

  • 选择auto x何时处理副本。
  • 选择auto &x何时想使用原始项目并可以修改它们。
  • 选择auto const &x何时处理原始项目并且不会修改它们。
用户回答回答于

如果你有一个std::vector<int>or std::vector<double>,那么使用auto(使用值拷贝)而不是const auto&,因为复制一个int或一个double便宜:

for (auto x : vec)
    ....

但是,如果你有一个std::vector<MyClass>,那里MyClass有一些非平凡的复制语义(例如std::string,一些复杂的自定义类等),那么我建议使用const auto&以避免深层复制

for (const auto & x : vec)
    ....

扫码关注云+社区