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]、2 番目の反復では 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

Iterator はベクトルへのインデックスではありません。これは、ベクトルの要素を指すオブジェクトであり、その反復子が指す要素の値を生成する逆参照演算子をオーバーロードしています。

を行うときは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 に答える
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 に答える