【问题标题】:Logic error with my range-for loop我的 range-for 循环出现逻辑错误
【发布时间】:2014-12-22 11:51:18
【问题描述】:

我作为初学者正在学习 C++(我是 2 个月前开始的),但我的简单代码有问题。我试图将此向量中每个元素的值设置为 0,但我不明白为什么它不起作用:

vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 

for (int x : numbers) x = 0; 

我知道我可能听起来很愚蠢,但我是初学者。如果我尝试用传统的 for 循环做同样的事情,它可以工作,为什么?

【问题讨论】:

  • 看来on paper n3853的提案试图解决的误解;我想你会觉得它很有趣。

标签: c++ for-loop vector


【解决方案1】:

它不会更改数组中的值,因为在每次迭代中,数组中的值都分配给 x,而您更改的是 x 而不是数组中的值。

基于范围的循环基本上类似于下面的普通for循环:

for(int i = 0; i < numbers.length(); i++)
{
     int x = numbers[i];

     //your code
}

.

有关更多信息,请查看 c++ 文档: http://en.cppreference.com/w/cpp/language/range-for 。 它指出:

range_expression 被评估以确定序列或范围 迭代。序列的每个元素依次被取消引用并且 分配给具有类型和名称的变量 range_declaration。

您还可以在那里找到“Shmil The Cat”发布的示例以及更多示例,这些示例将帮助您了解范围循环的工作原理。

【讨论】:

    【解决方案2】:
    for (int& x : numbers) x = 0; 
    

    为了变异容器元素,应该使用范围循环迭代变量的引用(默认情况下,迭代变量是当前迭代元素的副本 )

    【讨论】:

    • 解释:基于范围的for循环按值取参数,除非你指定按引用取
    【解决方案3】:

    它不起作用,您没有通过foreach 对数组中的元素进行任何引用。想一想,您正在检索数组numbers 中的元素,并在x 中复制没有引用的副本。所以 x 经历的任何变化都不会反映在数字数组中。

    所以按照@Shmil The Cat 的建议工作。或者传统的方式也可以像你说的那样做。

    【讨论】:

      【解决方案4】:

      向量的项目没有被赋值(在这种情况下为零),因为基于范围的循环将容器视为原始容器的副本,直到显式传递原始容器的引用。

      使用

      for (int& x : numbers) x = 0; 
      

      正如@Shmil The Cat 所建议的那样

      【讨论】:

        【解决方案5】:

        为了帮助您理解,您可以阅读以下内容:

        对于 numbers 中的每个元素,复制数据到 x 并将 x 设置为 0。 // 现在这不会触及向量中的值。

        for (int x : numbers) 
            x = 0; 
        

        阅读以下循环:
        对于 numbers 中的每个元素,对其进行 reference,并通过对 0 的引用来更改值。另一方面,这会更改向量中的值。

        for (int &x : numbers)
            x = 0;
        

        【讨论】:

          【解决方案6】:

          如果您只想为所有元素设置一个特定值,最好使用std::fill

          std::fill(numbers.begin(), numbers.end(), 0);
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多