代码之家  ›  专栏  ›  技术社区  ›  Edamame

在对我的集合执行for循环时应该使用引用吗?[复制]

  •  0
  • Edamame  · 技术社区  · 6 年前

    通过阅读一些基于范围的循环的例子,他们提出了两种主要的方法 1 , 2 , 3 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 
    }
    

    不是更好吗?当它是一个 ?

    0 回复  |  直到 11 年前
        1
  •  413
  •   Sarfaraz Nawaz    12 年前

    避免 那就复印吧 auto const &

    for (auto const &x : vec)
    

    不管是谁建议你使用 auto & 是错误的。忽略它们。

    • 选择 auto x 当你想处理拷贝时。
    • 选择 auto &x
    • 选择 auto const &x 当您想使用原始项而不修改它们时。
        2
  •  24
  •   Mr.C64    12 年前

    如果你有 std::vector<int> std::vector<double> auto (带值副本)而不是 const auto& ,因为复制了 int double

    for (auto x : vec)
        ....
    

    但是如果你有 std::vector<MyClass> ,其中 MyClass 有一些非平凡的复制语义(例如。 std::string 避免深度复制

    for (const auto & x : vec)
        ....
    
        3
  •  3
  •   Andy Prowl    12 年前

    当我们不需要改变的时候 vec

    然后他们给出了一个错误的建议。

    为什么他们不建议const引用的东西

    因为他们给出了错误的建议:-)你说的是正确的。如果你只想 观察 const 引用它。

    编辑:

    int 值或其他一些基本数据类型。既然如此,既然复制了 内景 const & .

    但是,对于用户定义的类型,通常不是这样。UDT的复制成本可能很高,如果您没有创建副本的理由(例如修改检索到的对象而不更改原始对象),则最好使用 .

        4
  •  1
  •   Benjamin Lindley    12 年前

    auto const & 在基于范围的for循环中。如果您认为以下函数是愚蠢的(不是它的目的,而是它的编写方式):

    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 自动调整& 作为基于范围的for循环中的变量而不是 auto & .