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


Answers

如果你有一个std::vector<int>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)
    ....
Question

阅读基于范围的循环的一些例子,他们提出了两种主要方式4

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 &在基于循环的范围内。 告诉我,如果你认为下面的功能是愚蠢的(不是它的目的,而是写它的方式):

long long SafePop(std::vector<uint32_t>& v)
{
    auto const& cv = v;
    long long n = -1;
    if (!cv.empty())
    {
        n = cv.back();
        v.pop_back();
    }
    return n;
}

在这里,作者已经创建了一个const引用v来用于所有不修改v的操作。在我看来,这是愚蠢的,并且可以使用auto const &作为基于范围的变量的相同参数循环,而不仅仅是auto &