3

我只是想问这里发生了什么,我哪里出错了?

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

4 回答 4

6

正确的打印方式是

 cout<<*it<<" ";   

*它给出向量指向的值。在您的情况下, a[*it] = a[1] 用于第一次迭代, a[2] 用于第二次迭代,依此类推。最后将打印无效号码。这是缺少第一个数字的原因。您试图打印 a[1] a[2], a[3],a[4],

于 2013-06-07T19:17:35.973 回答
4

通过调用*it,您将获得该迭代器的值(这是我认为您想要输出的)。您当前的代码实际上是在做:

a[1]
a[2]
a[3]
a[4]
a[5] // not an element in the vector - undefined behaviour

我认为你真正想要的是:

cout<<*it<<" ";
于 2013-06-07T19:17:34.483 回答
3

这里发生了什么

for(VI::iterator it = a.begin(); it!=a.end(); ++it) {
  cout<<a[*it]<<" "; // *it is 1, 2, 3, 4, 5
}

it是向量的每个元素的迭代器,并*it取消对迭代器的引用,给出元素的值。由于在这种情况下索引和存储的值几乎相同,这几乎可以工作。您正在从 a[1] 循环到 a[5],缺少第一个元素,然后超出范围。

于 2013-06-07T19:17:51.733 回答
3

迭代器不是向量的索引。它是一个指向向量元素的对象,并具有重载的解引用运算符,该运算符产生该迭代器指向的元素的值。

当您这样做时a[*it],您实际上使用存储在向量中的元素的值(由 指向it)作为该数组的索引。换句话说,您正在引用元素 2 到 6,并且还会调用未定义的行为,因为您的向量中没有第 6 个元素。

您可能打算写cout<<*it<<" "; 而不是cout<<a[*it]<<" ";. 或者,或者,给定该向量中的数据集,您可以cout<<a[*it - 1]<<" ";使用索引 0 到 4 访问元素 1 到 5。

希望能帮助到你。祝你好运!

于 2013-06-07T19:21:00.017 回答