【问题标题】:Vector with index and iterator带有索引和迭代器的向量
【发布时间】:2013-06-07 19:15:23
【问题描述】:

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

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&lt;&lt;*it&lt;&lt;" ";吗?
  • 而不是a[*it],只需使用*it。原因是it 是一个已经指向a 中的值的迭代器。

标签: c++ vector iterator


【解决方案1】:

正确的打印方式是

 cout<<*it<<" ";   

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

【讨论】:

  • 这不能回答问题。事实上,它完全没有抓住问题的重点。
  • @juanchopanza。现在完成我的解释。
【解决方案2】:

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

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

我认为你真正想要的是:

cout<<*it<<" ";

【讨论】:

  • @stefan 好点,我已经纠正了我的错误(并被一个错误诅咒了:p)
  • 太好了,我会删除我原来的评论以避免混淆。
【解决方案3】:

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

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

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

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

【讨论】:

    【解决方案4】:

    这里发生了什么

    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],缺少第一个元素,然后超出范围。

    【讨论】:

      最近更新 更多