-1

コードのコメント行を確認してください。

#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++)か?

ありがとう。

4

3 に答える 3

6

イテレータを2回増やしています。for ループ " header " 自体に入ると、次のようになります。

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

そして一度ループの中に

cout<<*it++<<endl;

したがって、要素をスキップしています。2 行目は次のようになります。

cout<<*it<<endl;

また、*(it++) は *(it+1) と同じではありません。これは、後置演算子 ++ が元の値を返すためです (一方、前置演算子はインクリメントされた値を返します)。さらに重要なことに、*(it+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"

ここで実際にこれを見ることができます

于 2013-07-08T16:22:10.233 に答える
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

はい、イテレータを 2 回増やします。ループ内で 1 回、印刷時に 1 回です。あなたは本当にそれをしたいですか?

于 2013-07-08T16:26:26.550 に答える
0

「cout<<*it++;」を印刷する際にイテレータをインクリメントしています。「cout<<*it;」のように出力するだけです。forループでプレフィックス表記「++it」を使用してイテレータをインクリメントします。イテレータは大きく、コンテナに関連するさまざまなデータを保持するため、次の行が実行されるまでコンピュータがイテレータを格納する必要がなくなります。

于 2013-07-08T16:33:19.010 に答える