[英]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.