[英]What is the difference between iterator and &iterator?
vector<int> A = {1, 2, 3};
//case 1
for(auto it : A){
it = 0;
}
print(A) //OUTPUT -> 1, 2, 3
//case 2
for(auto &it : A){
it = 0;
}
print(A) //OUTPUT -> 0, 0, 0
'it' 和 '&it' 有什么不同? iterator 和 &iterator 究竟是如何工作的?
auto
關鍵字(不使用&
)推斷非引用類型。 這意味着在您的情況 1 中, auto
it
推斷為int
類型。 這是一個非引用類型,這意味着來自std::vector
的值將被復制到循環變量it
中,這反過來意味着對其所做的任何更改it
不會反映在std::vector
本身中。
但是,在情況 2 中,由於在auto
中使用了&
, it
的循環變量是int&
類型,這是一個引用類型,您對其所做的任何更改it
將反映在原始向量上。
在 foreach 循環中使用&
作為類型時,循環將遍歷對向量中項目的引用。
如果您將秒循環編寫為:
for(auto& it : A){
it = 0;
}
然后這意味着auto
類型的元素將是對A
中元素的引用。
不使用&
時,每個元素都會在每次迭代中被復制,因此當您分配給它時,它對原始向量沒有影響。
在 C++11 及更高版本中使用auto
時,編譯器必須推斷類型。
根據文檔:
使用模板參數推導的規則推導類型。
這意味着像const
和volatile
這樣的限定符,以及作為指針或引用,不是推導類型的一部分。 換句話說,推導的類型將是分配給auto
變量的表達式的基本類型,沒有const
、 volatile
或指針/引用間接。
示例:如果您有如下功能:
A & GetA() { ... }
您可以通過多種方式使用它。 在所有這些中, auto
將被推斷為A
,但a
的類型會有所不同:
auto a = GetA(); // The type of `a` will be `A`, and a copy will be made.
auto & a = GetA(); // The type of `a` will be `A&`. No copy will be made.
auto const & a = GetA(); // The type of `a` will be `A const&`. No copy will be made and the compiler will verify you do not modify the referenced object.
// etc.
將此原則應用於您的案例:
for(auto it : A)
:auto
將被推斷為int
,這將是it
的類型。 因此,將復制A
中的元素並將其放入it
。 元素副本的任何修改都不會影響原始向量。for(auto & it : A)
:auto
仍將被推斷為int
,但it
的類型為int&
。 因此不會進行復制,而是我們將獲得對向量元素的引用。 這就是代碼能夠修改向量的原因。 附帶說明:使用基於范圍的循環(就像您一樣),意味着循環的變量將被分配給集合中的實際元素(或它們的引用)。 這實際上不是一個迭代器,因此將it
用作變量名會產生誤導。 最好在您的情況下使用例如a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.