2
class LargeClass
{}

void FunctionA(const LargeClass&) {}

std::vector<LargeClass> vecLargeClass; // populate vecLargeClass

const LargeClass* prev = vecLargeClass[0];
for( ... )
{
    ...
    if(...)
       prev = &vecLargeClass[i];
}

ベクトル内に格納されている要素への参照を保持する必要があります。コピーを避けるために、私は現在生のポインターを使用しています。または、要素を指すインデックスを格納できます。

これに対するより良い解決策はありますか?

4

2 に答える 2

4

はい、イテレータが無効にvectorされていない限り、要素への「参照」を保持できます。vectorそれは大きな警告です。

vectorイテレータは、vectorが再割り当てされると無効になります。これは、に要素を追加するたびに発生する可能性がありますvector。さらに、eraseからアイテムをvector取得すると、削除ポイント以降のすべてのイテレータが無効になります。

これはすべて非常に複雑で、心配する必要はありません。イテレータが無効にならないようにする必要がある場合(そのアイテム自体を削除しない限り)、avectorは使用に最適なコレクションではない可能性があります。代わりに、、、、またはその他のコレクションをlist検討することもできます。mapそれぞれに独自のトレードオフのセットがあることに注意してください。

ただし、イテレータについてはまったく気にする必要がない場合があります。vectorアイテム自体ではなく、アイテムへのポインターを格納した場合、ベクトルが再割り当てされても、ポインターが指すものは移動しません。もちろん、このルートを進むには、可能であればスマートポインタを使用する必要があります。一見すると、最高のものはであるように見えますshared_ptr。したがって、あなたのデルカレーションは次のようになります。

std::vector<shared_ptr<LargeClass>>

最後に、本当にaを使用する必要がありvector、スマートポインターをいじりたくない場合は、内のアイテムへの「参照」vectorではなく、それらのインデックス位置を追跡することをお勧めします。でアイテムを追跡したいとしますvecLargeClass[3]。イテレータを無効にするために何かを行ったとしても、問題のアイテムは引き続きインデックスにあります3interatorsや物事へのポインタを追跡する代わりに、それらがのどこにあるかを追跡しvectorます。

于 2012-11-07T17:17:56.893 に答える
0

ベクトル要素へのポインタまたは参照を格納するときは注意してください。push_back、など、これらの参照を無効にする可能性のある特定の操作がありresizeます。インデックスが変更されないと確信している場合は、最も安全です。コメントで言及されているmarcin_jのように、スマートポインターは、push_back、resizeなどの場合の無効化には役立ちません。

于 2012-11-07T17:13:35.303 に答える