[英]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循環來做同樣的事情,那么為什么呢?
for (int& x : numbers) x = 0;
為了改變容器元素,必須使用范圍循環迭代變量的引用(默認情況下,迭代變量是當前迭代元素的副本 )
它不會更改數組中的值,因為在每次迭代中,數組中的值都分配給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”的例子和更多的例子,它們將幫助你理解范圍循環的工作原理。
它不起作用,你沒有通過foreach
對數組中的元素進行任何引用。 想一想,你在檢索數組元素的numbers
,使副本的副本, x
不具有參考。 所以x經歷的任何變化都不會反映在數字數組中。
那么工作@Shmil The Cat
如何建議的。 或傳統方式也會像你說的那樣完成工作。
向量項未賦值(在本例中為零),因為基於范圍的循環將容器視為原始副本,直到顯式傳遞原始容器的引用。
好用
for (int& x : numbers) x = 0;
正如@Shmil The Cat所建議的那樣
為了幫助您理解,以下是您可以閱讀以下內容的方法:
在數字的每一個元素, 將數據復制到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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.