矢量与索引和迭代器

时间:2013-06-07 19:15:23

标签: c++ vector 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)],并且第一个元素在它实际应该是的内容中缺失。

4 个答案:

答案 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.

希望它有所帮助。祝你好运!