我只是想问一下这里发生了什么,我哪里出错?
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)]
,并且第一个元素在它实际应该是的内容中缺失。
答案 0 :(得分:6)
正确的打印方式是
cout<<*it<<" ";
*它给出了向量指向的值。在你的情况下,[* it] = a [1]用于第一次迭代,a [2]用于第二次迭代,依此类推。最后将打印无效的号码。它是缺少第一个号码的原因。 您试图打印[1] a [2],[3],[4],
答案 1 :(得分:4)
通过调用*it
,您将获得该迭代器的值(我认为您想要输出)。你现在的代码实际上在做:
a[1]
a[2]
a[3]
a[4]
a[5] // not an element in the vector - undefined behaviour
我认为你真正想要的是:
cout<<*it<<" ";
答案 2 :(得分:3)
这里发生了什么
for(VI::iterator it = a.begin(); it!=a.end(); ++it) {
cout<<a[*it]<<" "; // *it is 1, 2, 3, 4, 5
}
是it
是向量的每个元素的迭代器,*it
取消引用迭代器,给出元素的值。
由于在这种情况下存储的索引和值几乎相同,所以这几乎可以工作。你正在从[1]循环到[5],缺少第一个元素,然后超出界限。
答案 3 :(得分:3)
迭代器不是矢量的索引。它是一个指向向量元素的对象,它具有重载的解引用运算符,它产生迭代器指向的元素的值。
执行a[*it]
时,基本上使用存储在向量中的元素的值(由it
指向)作为该数组的索引。换句话说,您正在引用元素2到6,并且还调用未定义的行为,因为向量中没有第6个元素。
您可能打算写cout<<*it<<" ";
而不是cout<<a[*it]<<" ";
。或者,或者,给定您在该向量中的数据集,您可以执行cout<<a[*it - 1]<<" ";
以使用索引0到4访问元素1到5.
希望它有所帮助。祝你好运!