簡體   English   中英

矢量與索引和迭代器

[英]Vector with index and iterator

我只是想問一下這里發生了什么,我哪里出錯了?

vector<int> a(5);

for(int i=0; i<5; i++)    cin>>a[i];            //Input is 1 2 3 4 5

for(int i=0; i<5; i++)    cout<<a[i]<<" ";      //Prints correct, 1 2 3 4 5
cout<<endl;

for(VI::iterator it = a.begin(); it!=a.end(); ++it) {
    cout<<a[*it]<<" ";                          //Prints incorrect output
}
cout<<endl;

看起來,錯誤輸出中的最后一個元素是a[*(a.end()-1)]並且第一個元素缺少實際應該是什么。

正確的打印方式是

 cout<<*it<<" ";   

*它給出了矢量指向的值。 在你的情況下,[* it] = a [1]用於第一次迭代,a [2]用於第二次迭代,依此類推。 最后將打印無效的號碼。 它是缺少第一個號碼的原因。 你試圖打印[1] a [2],[3],a [4],

通過調用*it您將獲得該迭代器的值(我認為您想要輸出)。 你現在的代碼實際上在做:

a[1]
a[2]
a[3]
a[4]
a[5] // not an element in the vector - undefined behaviour

我認為你真正想要的是:

cout<<*it<<" ";

這里發生了什么

for(VI::iterator it = a.begin(); it!=a.end(); ++it) {
  cout<<a[*it]<<" "; // *it is 1, 2, 3, 4, 5
}

it是向量的每個元素的迭代器, *it取消引用迭代器,給出元素的值。 由於在這種情況下存儲的索引和值幾乎相同,所以這幾乎可以工作。 你正在從[1]循環到[5],缺少第一個元素,然后走出界限。

迭代器不是向量的索引。 它是一個指向向量元素的對象,它具有重載的解引用運算符,它產生迭代器指向的元素的值。

當你執行a[*it] ,你基本上使用存儲在向量中的元素的值(由it指向)作為該數組的索引。 換句話說,您正在引用元素2到6,並且還調用未定義的行為,因為向量中沒有第6個元素。

你可能打算寫cout<<*it<<" "; 而不是cout<<a[*it]<<" "; 或者,或者,給定您在該向量中的數據集,您可以執行cout<<a[*it - 1]<<" "; 為了使用索引0到4訪問元素1到5。

希望能幫助到你。 祝好運!

暫無
暫無

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

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