我的范围循环出现逻辑错误
Logic error with my range-for loop
我正在学习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);
- 错误:未在此范围内声明'reverse'
- 在 C++ 中使用正则表达式错误时出现问题 括号表达式中的范围无效
- 错误:"imread"未在此范围内声明
- 我在范围内未声明的错误类有问题
- 未在此范围内声明错误 'xy'
- 在C++中使用变量而不是"#define"来指定数组大小是不是一种糟糕的做法?(C错误:在文件范围内
- 运行时错误:矢量下标超出范围:正在检查空集
- 错误:'[' 之前预期的非限定 id 和错误:'users'未在此范围内声明
- 在此范围内未声明错误"Clreol"
- "myClock"未在此范围错误中声明
- 包含来自另一个文件的函数会导致范围错误(openFoam)
- 构造中错误:未在此范围中声明"data"
- 使用基于范围的指针循环和向量时出现C++错误
- DEV C++ 第 69 行 [错误] ISO "for" 范围更改了"i"的名称查找 [-允许]
- C++ 中的类之间的数据重新循环 - 错误:'<class name>'未在此范围内声明
- 使用to_string、reverse、stoi组合的C++反转编号给出运行时错误实例超出范围
- 如何避免指针超出范围(多态性)的C++分段错误
- 代码作为 C 文件工作,但不作为C++文件,错误:'__builtin_types_compatible_p'未在此范围内声明
- 如何修复范围内的字符串声明错误
- 如何修复错误:"vreinterpretq_u32_f64"未在此范围内声明 - 在Android上使用Eigen构建