簡體   English   中英

迭代器和 &iterator 有什么區別?

[英]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 究竟是如何工作的?

情況1

auto關鍵字(不使用& )推斷非引用類型。 這意味着在您的情況 1 中, auto it推斷為int類型。 這是一個非引用類型,這意味着來自std::vector的值將被復制到循環變量it中,這反過來意味着對其所做的任何更改it不會反映在std::vector本身中。

案例2

但是,在情況 2 中,由於在auto中使用了&it的循環變量是int&類型,這是一個引用類型,您對其所做的任何更改it將反映在原始向量上。

在 foreach 循環中使用&作為類型時,循環將遍歷對向量中項目的引用。

如果您將秒循環編寫為:

    for(auto& it : A){
        it = 0;
    }
    

然后這意味着auto類型的元素將是對A中元素的引用。

不使用&時,每個元素都會在每次迭代中被復制,因此當您分配給它時,它對原始向量沒有影響。

在 C++11 及更高版本中使用auto時,編譯器必須推斷類型。
根據文檔

使用模板參數推導的規則推導類型。

這意味着像constvolatile這樣的限定符,以及作為指針或引用,不是推導類型的一部分。 換句話說,推導的類型將是分配給auto變量的表達式的基本類型,沒有constvolatile或指針/引用間接。

示例:如果您有如下功能:

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.

將此原則應用於您的案例:

  1. for(auto it : A)
    auto將被推斷為int ,這將是it的類型。 因此,將復制A中的元素並將其放入it 元素副本的任何修改都不會影響原始向量。
  2. for(auto & it : A) :
    auto仍將被推斷為int ,但it的類型為int& 因此不會進行復制,而是我們將獲得對向量元素的引用。 這就是代碼能夠修改向量的原因。

附帶說明:使用基於范圍的循環(就像您一樣),意味着循環的變量將被分配給集合中的實際元素(或它們的引用)。 這實際上不是一個迭代器,因此將it用作變量名會產生誤導。 最好在您的情況下使用例如a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM