我的range-for循环出现逻辑错误

时间:2014-12-22 11:51:18

标签: c++ for-loop vector

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

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

for (int x : numbers) x = 0; 

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

6 个答案:

答案 0 :(得分:3)

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

为了 mutate 容器元素,必须使用范围循环迭代变量的引用(默认情况下,迭代变量是当前迭代元素的 copy

答案 1 :(得分:3)

它不会更改数组中的值,因为在每次迭代中,数组中的值都分配给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 :(得分:1)

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

了解@Shmil The Cat建议的方式。或传统方式也会像你说的那样完成工作。

答案 3 :(得分:1)

向量项未赋值(在本例中为零),因为基于范围的循环将容器视为原始副本,直到显式传递原始容器的引用。

使用

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

由@Shmil The Cat

建议

答案 4 :(得分:0)

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

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

for (int x : numbers) 
    x = 0; 

阅读以下循环:
对于数字中的每个元素,对其进行引用,并通过引用将值更改为0.另一方面,更改向量中的值。 / p>

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

答案 5 :(得分:0)

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

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