5

vectorのヘルプfront()

ベクター コンテナー内の最初の要素への参照を返します。vector::beginこの同じ要素への反復子を返すmember とは異なり、この > 関数は直接参照を返します。

ベクターのヘルプは次のように述べていますbegin()

ベクター コンテナー内の最初の要素を参照する反復子を返します。vector::front> 最初の要素への参照を返すmember とは異なり、この関数はランダム アクセス反復子を返すことに注意してください。

そして、このコードは以下を出力します:

char arr[] = { 'A', 'B', 'C' };
vector<char> vec(arr, arr+sizeof(arr));
cout << "address of vec.front() " << (void*)&vec.front() << endl;
cout << "address of vec.begin() " << (void*)&vec.begin() << endl;

の住所のvec.front() 00401F90 住所vec.begin() 0030F494

「直接参照」の意味がわかりません。a が aだけでbegin()はない場合は?random access iteratorpointer

誰かが違いを指摘できますか?

4

5 に答える 5

14

The C++ Programming Language のStroustrupによると、セクション 16.3.3; 最初の要素および最初の要素へのポインターと考えてください。front()begin()

于 2012-10-11T13:53:00.413 に答える
8

begin() の場合、ランダム アクセス イテレータは単なるポインタではありませんか?

いいえ、反復子にはいくつかのポインター セマンティクスがありますが、実際にはクラスです。

たとえそうだったとしても、それは質問に答えるはずです。ポインターのアドレスが、それが指しているオブジェクトのアドレスと同じではない理由を尋ねるようなものです。

イテレータを逆参照すると、同じ値が得られます。これにより、最初の要素が得られます。

&(*vec.begin())

なぜなら

*vec.begin() == vec.front()
于 2012-10-11T13:49:25.523 に答える
4

ベクトルの場合、ランダム アクセス反復子begin()を返します。end()それらはプレーンなポインタを返すかもしれません。これは、ランダム アクセス イテレータになるための要件を満たしているためです。特に、*begin()シーケンス内の最初のオブジェクトへの参照を取得するように記述できます (存在する場合)。front()中間イテレータを介さずに、シーケンス内の最初のオブジェクトへの参照を提供します。このような:

vector<int> v;
v.push_back(3);
int i = *v.begin(); // i == 3
int j = v.front();  // j == 3
于 2012-10-11T13:52:59.283 に答える
3

ベクトルに少なくとも 1 つの要素があると仮定すると、

vec.front()

と同じです

*vec.begin()
于 2012-10-11T13:49:43.723 に答える