繁体   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