1

クラスへのポインタを保持するためにベクトルを使用しています。

class fooContainer{
private:
    vector <Foo *> foos;
public:
    void processFoo(int fooIndex);
};

私が直面している問題はpop_back()、要素を削除することです。ベクトルから削除したいだけで、問題のオブジェクトには触れたくないのです。また、メイン サイクルを再開する準備として、ベクトルからすべての要素を削除する必要があります (ただし、クラス属性である同じベクトルを保持します)。

動的なサイズ変更を行うが、その要素をコピーまたは削除せず、それらへのポインターを保持するだけの構造が必要です。

より良い代替構造はありますか、またはそれらをすべて間違って使用していますか?

4

4 に答える 4

4

ベクターはそのコンテンツをコピーして破棄しますが、あなたの場合、コンテンツはオブジェクトではなくオブジェクトへのポインターです。
オブジェクトへの特定のポインターは破棄されますが、そのオブジェクトへの他のポインターとオブジェクト自体は破棄されません。

于 2012-09-24T12:26:50.977 に答える
1

あなたが持っているものはまさにそれを行います。ベクトル ポイント内のオブジェクト要素は、明示的に指定しない限り破棄されませんdelete

または、所有権を共有して複数の場所で同じポインターを使用する場合は、 を使用することをお勧めしstd::shared_ptrます。

于 2012-09-24T12:23:31.403 に答える
0

pop要素を「ドロップ」するのではなく、ベクターから削除するだけです。ベクターにはポインターが含まれているため、それらを適切に削除する責任があります。

ベクターはまさにあなたが求めていることを行います。

要素を削除するには、呼び出すだけですvector.clear()

于 2012-09-24T12:24:13.410 に答える
-1

ベクターからポインターのコピーを取得したいだけの場合は、Foo* pfoo = v[0] またはat(index)関数を使用してアクセスをチェックできます。

また、すべてのポインターをクリアしたい場合は、それらをループしてすべて削除し、呼び出しv.clear()てすべての要素を削除できます。

ポインタの削除をすでに正しく行っているベクトルが必要な場合は、boost::vector_ptr

于 2012-09-24T12:24:29.733 に答える