web-dev-qa-db-ja.com

std ::参照のベクトル

私はそのような問題を抱えています:Fooクラスがあり、このクラスのオブジェクトがある場合、

Foo a();

このオブジェクトを2つの異なるベクトルに配置する必要があります。

std::vector<Foo> vA, vB;

avAで変更された場合、vBで変更する必要があります。ベクトルvAvBは異なる場合がありますが、同じオブジェクト。 Boostで実行できることは知っていますが、Boostを使用できません。

23
Mike Minaev

いくつかの可能性があります:

  1. ポインタのベクトルを格納します(ベクトル共有の所有権ポインタの場合に使用):

    _std::vector<std::shared_ptr<Foo>> vA, vB;
    _
  2. ラップされた参照のベクトルを格納します(ポインターのベクトル所有権を共有しないであり、参照されるオブジェクトがわかっている場合areベクトルの存続期間を超えて有効な場合):

    _std::vector<std::reference_wrapper<Foo>> vA, vB;
    _
  3. 生のポインタのベクトルを格納します(ベクトルポインタの所有権を共有しないでくださいの場合に使用します)、および/または格納されているポインタは他の要因によって変わる可能性があります):

    _std::vector<Foo*> vA, vB;
    _

    これは、観察、割り当ての追跡などで一般的です。生のポインターに関する通常の注意事項が適用されます。オブジェクトの寿命が終了した後は、ポインターを使用してオブジェクトにアクセスしないでください。

  4. オブジェクトをラップする_std::unique_ptr_のベクトルを保存します(ベクトルが必要な場合に使用しますポインターの所有権を引き継ぎますこの場合、参照されるオブジェクトの存続期間は_std::unique_ptr_クラス):

    _std::vector<std::unique_ptr<Foo>> vA, vB;
    _
48
utnapistim

参照のベクトルが必要です。そして、std :: vectorを使用する必要があると指定したので、正しいことは、オブジェクトをstd::reference_wrapperでラップすることです。 このページはC++リファレンスから でうまく説明できます。

vector<reference_wrapper<Foo>> vA, vB;
vA.Push_back(a);
vB.Push_back(a);    // puts 'a' into both vectors

// make changes to 'a'
// use .get() to get the referenced object in the elements of your vector
// vA[0].get() == vB[0].get()
11
alpartis

Fooをオブジェクトとして保持する代わりに、オブジェクトFooへのポインタとして保持します。

std::vector<Foo *> vA, vB;

また、メモリリークを回避するために、割り当てと割り当て解除を慎重に管理してください(割り当ては行われますが、割り当て解除は行われません)。 1つのFooオブジェクトを割り当て、ポインターをvAとvBの両方に保持すると、ポインターを通じて本質的に同じオブジェクトが両方に保持されます。それ以外の場合は、スマートポインター(より良い)参照を使用できます。

スマートポインターとは何ですか、いつ使用すべきですか?

2