首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >基于C ++ 11范围的循环:按值或引用const获取项目?

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

Stack Overflow用户
提问于 2018-03-20 00:09:55
回答 2查看 0关注 0票数 0

读取基于范围环的一些例子他们建议两种主要方式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

EN

回答 2

Stack Overflow用户

发布于 2018-03-20 09:07:15

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

for (auto const &x : vec)

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

这里回顾一下:

  • 选择auto x何时处理副本。
  • 选择auto &x何时想使用原始项目并可以修改它们。
  • 选择auto const &x何时处理原始项目并且不会修改它们。
票数 0
EN

Stack Overflow用户

发布于 2018-03-20 09:31:18

如果你有一个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)
    ....
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100007681

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档