使用对范围中的矢量元素的引用

Using a reference to vector elements in a ranged for

本文关键字:元素 引用 范围      更新时间:2023-10-16

我试图理解为什么我需要在范围中使用引用,以使以下表达式应用于向量中的元素。

该代码只是定义一个向量并初始化一些元素,然后使用范围 for 对它们进行平方,并打印输出。

int main() {
        vector<int> v1{1,2,3,4,5};
        for (auto &i : v1)
                i *= i;
        for (auto i : v1)
                cout << i << " ";
        cout << endl;
}

以上有效,但如果对于我使用的第一个范围:

for (auto i : v1)

然后元素不会平方。这里有什么区别?我不明白在这种情况下需要使用引用,但以后当我想使用另一个范围 for 来引用每个元素时,我就不明白了。

简单地说:

for (auto i : v1)将值复制到新变量中。

for (auto &i : v1)引用向量中的实际值。

int i = 7; // i = 7
int j = i; // j = 7 (a copy of i)
j *= j; // j = 49 (but i, fortunately, is still 7)

当然:

int i = 7; // i = 7
auto j = i; // j = 7 (a copy of i)
j *= j; // j = 49 (but i is still 7)

在基于范围的循环中也会发生同样的情况:

for (auto i : v) // i is a copy of an element of v
    i*= i; // you square the copy of the element of v, not the element itself