我的范围循环出现逻辑错误

Logic error with my range-for loop

本文关键字:错误 范围 循环 我的      更新时间:2023-10-16

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

vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; 
for (int x : numbers) x = 0; 

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

它不会更改数组中的值,因为在每次迭代中,数组中的值都分配给 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"发布的示例以及更多示例,这些示例将帮助您了解范围循环的工作原理。

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

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

不起作用,您没有通过foreach对数组中的元素进行任何引用。考虑一下,您正在检索数组numbers中的元素,并在没有引用的x中复制副本。因此,x 经历的任何更改都不会反映在数字数组中。

所以按照@Shmil The Cat建议的方式工作。 或者传统方式也会像你说的那样完成这项工作。

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

使用确实

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

正如@Shmil猫所建议的那样

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

对于数字中的每个元素,将数据复制到 x 中并将 x 设置为 0。

for (int x : numbers) 
    x = 0; 

阅读以下循环:
对于数字中的每个元素,引用它,并通过引用将值更改为 0。另一方面,这会更改向量中的值。

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

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

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