質問

私はベクトルのmyObjectsグローバルです。い方法を使用する std::vector<myObject>::const_iterator 横ベクトル、一部の比較を探特定の要素となります。また、必要な要素、たいができるようになるまでのポインタでのベクトルが存在するグローバル範囲).

場合に戻したい &iterator, んのアドレスの反復子は、アドレスの反復子が差し。

いただいた後にキャスト const_iterator 再myObject、そのアドレスを返しますのでしょうか?

役に立ちましたか?

解決

イテレータが指すもののアドレスを返します:

&(*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
}

ポインターのベクターまたは動的割り振りは不要です。

他のヒント

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

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

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

編集後のコメント: 'はい、イテレータを返したくありませんでしたa)const、およびb)確かにローカルの一時的なイテレータだけですか? <!>#8211; Krakkos '

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

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

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

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

ベクターがグローバルスコープ内にある限り、以下を返すことができます。

&(*iterator)

これは一般的に非常に危険であることに注意してください。ベクターがグローバルスコープから外れて破壊された場合、myObjectへのポインターは無効になります。これらの関数をより大きなプロジェクトの一部として作成している場合、非constポインターを返すと、戻り値が削除される可能性があります。これは、アプリケーションに未定義の壊滅的な影響を与えます。

これを次のように書き換えます:

myObject myFunction(const vector<myObject>& objects)
{
    // find the object in question and return a copy
    return *iterator;
}

返されたmyObjectを変更する必要がある場合は、値をポインターとして保存し、ヒープに割り当てます:

myObject* myFunction(const vector<myObject*>& objects)
{
    return *iterator;
}

その方法で、いつ破壊されるかを制御できます。

次のようなものはアプリを破壊します:

g_vector<tmpClass> myVector;

    tmpClass t;
    t.i = 30;
    myVector.push_back(t);

    // my function returns a pointer to a value in myVector
    std::auto_ptr<tmpClass> t2(myFunction());

ベクターの data 関数を使用できます:

  

ベクターの最初の要素へのポインターを返します。

最初の要素へのポインタが必要ではなく、インデックスが必要な場合は、次を試してください:

//the index to the element that you want to receive its pointer:
int i = n; //(n is whatever integer you want)

std::vector<myObject> vec;
myObject* ptr_to_first = vec.data();

//or

std::vector<myObject>* vec;
myObject* ptr_to_first = vec->data();

//then

myObject element = ptr_to_first[i]; //element at index i
myObject* ptr_to_element = &element;

次のようになります:

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

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

ただし、STLの設計に合わせて、後でSTLアルゴリズムに渡す場合は、代わりにイテレータを返すことをお勧めします。

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

参照dirkgently、匿名の答えができるの フロント 機能の代わりに を開始 機能ことができるようになり、 ない 書の *, ものみ &.

コード例:

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.

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

return iterator._Ptr;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top