2

vector私はC++で s をいじっていましたが、この問題を見つけて、かなり混乱しました...

#include <vector>
#include <cstdio>
using namespace std;

int main()
{
  vector<int> v;
  v.push_back(1);
  v.push_back(2);
  v.push_back(3);

  for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
  {
    printf("At: %p, %i\n", &it, *it);
  }
}

そして、私はこのプログラムを実行しました

g++ -Wall soquestion.cpp -o soquestion
./soquestion

出力

At: 0x7fff59c80a98, 1
At: 0x7fff59c80a98, 2
At: 0x7fff59c80a98, 3

itしかし、アドレスは毎回インクリメントされていると思いましたか??

4

5 に答える 5

2

最初の値は、変更されていないメモリ内の反復子オブジェクトへの参照として解釈します。インスタンス化されると、オブジェクト参照は定数になります。

2 番目の値は、インクリメントされるベクトルへのインデックスです。インクリメントされるのは、反復子オブジェクトではなく、反復子自体の内部のプライベート データ メンバーです。

イテレータ オブジェクトについて正しく考えているとは思えません。

于 2013-09-06T19:07:24.603 に答える
1

イテレータアドレスは現在のスコープで固定されたままです

おそらくこれが欲しかったと思います:

printf("At: %p, %i\n", &*it, *it);
于 2013-09-06T19:13:13.790 に答える