我正在学习C ++作为初学者(我在2个月前开始)并且我的简单代码存在问题。我试图将此向量中每个元素的值设置为0但我无法理解为什么它不起作用:
vector<int> numbers = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (int x : numbers) x = 0;
我知道我可能听起来很愚蠢,但我是初学者。如果我尝试用传统的for循环来做同样的事情,那么为什么呢?
答案 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);