70

グローバル スコープに myObjects のベクトルがあります。a を使用しstd::vector<myObject>::const_iteratorてベクトルをトラバースし、特定の要素を見つけるためにいくつかの比較を行うメソッドがあります。必要な要素を見つけたら、その要素へのポインターを返すことができるようにしたいと考えています (ベクトルはグローバル スコープに存在します)。

を返す場合&iterator、イテレータのアドレスを返しますか、それともイテレータが指しているアドレスを返しますか?

バックを myObjectにキャストしconst_iteratorてから、そのアドレスを返す必要がありますか?

4

9 に答える 9

103

イテレータが指すモノのアドレスを返します。

&(*iterator)

編集:混乱を解消するには:

vector <int> vec;          // a global vector of ints

void f() {
   vec.push_back( 1 );    // add to the global vector
   vector <int>::iterator it = vec.begin();
   * it = 2;              // change what was 1 to 2
   int * p = &(*it);      // get pointer to first element
   * p = 3;               // change what was 2 to 3
}

ポインターのベクトルや動的割り当ては必要ありません。

于 2009-03-13T09:01:33.517 に答える
15

&iterator を返すと、イテレータのアドレスが返されます。要素を参照する方法を返したい場合は、イテレータ自体を返します。

イテレータ/ポインタを返すためにベクトルをグローバルにする必要はありませんが、ベクトル内の操作によってイテレータが無効になる可能性があることに注意してください。たとえば、ベクトルに要素を追加すると、新しい size() が予約済みメモリより大きい場合、ベクトル要素を別の位置に移動できます。ベクターから指定されたアイテムの前の要素を削除すると、反復子は別の要素を参照します。

どちらの場合も、STL の実装によっては、ランダムなエラーが頻繁に発生するだけでデバッグが困難になる場合があります。

コメント後の編集: 'はい、イテレータを返したくありませんでした。a) const であり、b) 確かにローカルの一時的なイテレータにすぎませんか? – クラッコス

イテレータは、他の変数よりも多かれ少なかれローカルまたは一時的ではなく、コピー可能です。あなたはそれを返すことができ、コンパイラーはポインターと同じようにコピーを作成します。

今const-nessで。呼び出し元が返された要素 (ポインターまたはイテレーター) を介して変更を実行する場合は、非定数イテレーターを使用する必要があります。(イテレータの定義から「const_」を削除するだけです)。

于 2009-03-13T09:03:54.150 に答える
3

イテレータを返すのは得策ではありません。ベクトルへの変更 (反転\削除) が発生すると、反復子は無効になります。また、反復子はスタック上に作成されたローカル オブジェクトであるため、同じアドレスを返すことはまったく安全ではありません。ベクトル反復子ではなく myObject を使用することをお勧めします。

編集: オブジェクトが軽量の場合は、オブジェクト自体を返す方がよいでしょう。それ以外の場合は、ベクターに格納されている myObject へのポインターを返します。

于 2009-03-13T09:02:21.033 に答える
0

dirkgently と anon の回答を参照してください。begin関数の代わりにfront関数を呼び出すことができるため、 を記述する必要はなく、.*&

コード例:

vector<myObject> vec; //You have a vector of your objects
myObject first = vec.front(); //returns reference, not iterator, to the first object in the vector so you had only to write the data type in the generic of your vector, i.e. myObject, and not all the iterator stuff and the vector again and :: of course
myObject* pointer_to_first_object = &first; //* between & and first is not there anymore, first is already the first object, not iterator to it.
于 2014-09-05T20:29:25.880 に答える
0

たとえば、次のものがあるとします。

std::vector<myObject>::const_iterator first = vObj.begin();

次に、ベクトルの最初のオブジェクトは次のとおり*firstです。アドレスを取得するには、次を使用します&(*first)

ただし、STL 設計に合わせて、後で STL アルゴリズムに渡す予定がある場合は、代わりに反復子を返すことをお勧めします。

于 2009-03-13T09:02:46.197 に答える
0

myObject のコピーをベクターに格納しています。したがって、myObject のインスタンスをコピーすることは、コストのかかる操作ではないと思います。次に、関数から myObject のコピーを返すのが最も安全だと思います。

于 2009-03-13T10:21:48.330 に答える
0

イテレータが指すもののアドレスを返す必要があるかどうかはわかりません。必要なのはポインター自体だけです。この目的のために _Ptr の使用を実装する STL の iterator クラス自体が表示されます。したがって、次のようにします。

return iterator._Ptr;
于 2014-11-29T17:12:02.790 に答える