-1

Please check the commented line of code:

#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;
}

I'm reading about iterators and trying some things. That line seems to print the element it refers to, then increment it. In fact it produces the same results as:

  cout<<*it<<endl;
  it++;

I didn't explain it clearly, the real question is: can you perform 2 operations on an iterator like that?

And why *(it+1) is different than *(it++)?

Thanks.

4

3 回答 3

6

您将迭代器增加两次。一旦进入 for 循环“标头”本身:

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

并且一旦进入循环

cout<<*it++<<endl;

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

cout<<*it<<endl;

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

如果我有一个迭代器指向索引 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"

您可以在这里看到这一点。

于 2013-07-08T16:22:10.233 回答
0

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

于 2013-07-08T16:33:19.010 回答
0

it++意思是“增加它,并在它增加之前返回它的值”。这只是后缀++运算符的语义。(它对整数的行为相同)。它不起作用,*(it+1)因为现在您没有增加迭代器,而只是查看下一个值。(it+1)根本没有变化it,而 it++ 或 ++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

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

于 2013-07-08T16:26:26.550 回答