C ++迭代器操作

时间:2013-07-08 16:20:58

标签: c++ iterator

请检查注释的代码行:

#include <iostream>
#include <vector>

using namespace std;

  int main()
  {
    vector<int>numbers{1,2,3,4,5,6,7,8};
    vector<int>::iterator it, beg=numbers.begin(), end=numbers.end();

    for(it=beg; it!=end; it++){
        cout<<*it++<<endl; //THIS LINE PRINTS 1 3 5 7
    }

  return 0;
}

我正在阅读迭代器并尝试一些事情。该行似乎打印了it引用的元素,然后递增it。实际上它产生的结果与:

相同
  cout<<*it<<endl;
  it++;

我没有清楚地解释清楚,真正的问题是:你能在这样的迭代器上执行2次操作吗?

为什么*(it+1)*(it++)不同?

感谢。

3 个答案:

答案 0 :(得分:6)

你正在增加你的迭代器两次。一旦进入for循环“ header ”本身:

for(it=beg; it!=end; it++){

一旦进入循环

cout<<*it++<<endl;

因此你正在跳过元素。第二行应该是:

cout<<*it<<endl;

此外,*(it ++)与*(it + 1)不同,因为后缀运算符++返回原始值(而前缀返回递增的值)。更重要的是,*(它+ 1)实际上并没有增加迭代器,使用++。让我们用一个例子来说明:

如果我有一个指向索引0处元素的迭代器:

*(it++) // will print element at index 0 and move the iterator forward to index 1
*(++it) // will move the iterator at index 1 and print element at index 1
*(it+1) // will print element at index 1, the iterator does not "move"

您可以在行动here中看到这一点。

答案 1 :(得分:0)

it++表示“增加它,并在它增加之前返回它的值”。这只是postfix ++运算符的语义。 (整数表现相同)。它在*(it+1)中不起作用,因为现在你没有增加迭代器,只是查看下一个值。 (it+1)根本不会改变it,而它会改变++或++。

示例:

#include <iostream>

int main() { 
  int a = 0;
  std::cout << (a++) << "\n"; // Postfix ++, that you used. Prints 0
  std::cout << a << "\n";     // but now a is 1.
  std::cout << (++a) << "\n"; // Prefix ++, increases a and returns the increased value => Prints 2
  std::cout << a << "\n";     // Prints 2
}

Ideone链接:http://ideone.com/QvkdlX

是的,你的迭代器增加了两次,一次在循环中,一次在打印时。你真的想要吗?

答案 2 :(得分:0)

在打印“cout&lt;&lt; * it ++;”时,您正在递增迭代器。我会像这样打印它“cout&lt;&lt; * it;”并在for-loop中使用前缀表示法“++ it”递增迭代器。由于迭代器很大并且保存与容器相关的各种数据,因此这将使计算机不必存储迭代器直到下一行执行。