【问题标题】:What is the difference between the two codes: for(auto x : v) and for(auto& x : v) [duplicate]两个代码有什么区别: for(auto x : v) 和 for(auto& x : v) [重复]
【发布时间】:2020-12-07 06:27:24
【问题描述】:

我无法理解这两个代码之间的区别,因为它们给了我相同的输出?

void print() {
  int v[] = {0,1,2,3,4,5};
  for(auto x : v)
    cout << x << endl;
}

void increment() {
  int v[] = {0,1,2,3,4,5};
  for(auto& x : v) {
    cout << x << endl;
    ++x;
  }
}

【问题讨论】:

  • 你了解++x 的作用吗?你了解引用变量吗?
  • 一方面,x 是(顺序)数组中每个值的副本。另一方面,它是对数组中每个值的引用。
  • 是的,我知道 ++x 是做什么的,但我不明白您所说的引用变量是什么意思? @比尔林奇
  • 在第一个例子中,x 是一个int,在循环体中,给出了被操作元素的值。对x 所做的任何事情都不会影响v 的元素,因为它是元素的副本。在第二个中,x 是对 v 元素的非 const 引用(因为您尚未指定 const),因此 ++x 将增加该元素。

标签: c++ arrays function loops


【解决方案1】:

第一个代码 sn-p 将显示v 数组的每个元素没有任何引用(即它们的修改值不会应用于原始v,因为那将只是一份。

另一方面,另一个 sn-p 表示它将首先输出元素,然后元素的值将递增,无论它是 1,v 将被更改。

【讨论】:

  • “支配”是什么意思?我以前没有在这种情况下看到过这个术语。
【解决方案2】:

这两个代码都会为您提供相同的输出。但是在for循环结束时,数组v的值是不同的。

首先,x 只是数组v 中项目的另一个副本。如果你再次打印数组v 的值,那么它将是相同的。

在第二个中,x 是数组v 中给定项的引用。此代码正在打印该值,然后将其增加 1。如果再次打印数组 v 的值,则其中的所有元素都增加 1。

试试下面的代码:

int v[] = {0,1,2,3,4,5};
cout << "Before :";
for(auto& x : v) {
    cout << x << ", ";
    ++x;
}
cout << endl << "After: ";
for (auto x: v) {
    cout << x << ", ";
}

你会得到以下输出:

Before: 0, 1, 2, 3, 4, 5,                                                                                                                                     
After: 1, 2, 3, 4, 5, 6,  

基本上,您的两个代码在 for 循环的末尾都有不同的数组 v 值。

【讨论】:

    【解决方案3】:

    在第一个 sn-p x 是一个数组元素的副本,在第二个它是一个引用。第二个 sn-p 确实增加了数组中的每个元素,但您没有注意到这一点。

    自然写循环的方式是

    for (auto&& x : v) {
    

    请参阅What is the advantage of using forwarding references in range-based for loops? 了解说明。

    在很多方面很遗憾,速记

    for (x : v) {
    

    (这意味着auto&amp;&amp; x : v)没有被引入标准。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      • 2019-08-01
      • 2013-10-22
      • 2021-11-18
      相关资源
      最近更新 更多