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