2

あるタイプのベクトルがあり、ベクトル内の他の要素を移動せずに、要素をランダムな順序で破壊したいと考えています。後で、それらの破壊された穴に新しいものを挿入する場合があります(またはしない場合もあります)。ベクトルを破棄するとき、既に破棄されている要素のデストラクタを呼び出したくないので、そうすることが可能ですか?

ベクトル要素の型として char[sizeof(T)] を使用することを考えていましたが、std::align_of と std::aligned_storage は POD ストレージにのみ適していることがわかりました。では、これが POD 以外のタイプで確実に機能するようにするにはどうすればよいですか?

これを行う他の方法はありますか?

私は MSVS2010 に取り組んでおり、間もなく 2013 にアップグレードされる可能性があります。

4

3 に答える 3

6
std::vector<boost::optional<T>> v;
...
v[i] = boost::none; // destroy an object

を使用できない場合boost、独自のクラスを実装するのoptionalはかなり簡単です。オブジェクトが有効かどうかを示すstd::aligned_storage<T>とともに使用するだけです。bool

于 2013-09-20T04:57:56.100 に答える
0

私があなたの問題を正しく理解していれば、shared_ptrs のベクトルを使用してこれを解決できます。要素を取り除きたい場合は、nullptr shared_ptr に割り当てます。

于 2013-09-20T05:05:28.070 に答える
-1

配列を使用しますか?

Type * a = new Type[BASE_SIZE];

挿入するとき、拡張する必要がある場合はこれを使用します

Type * tmp = new Type[BIGGER_SIZE];
std::copy(a, a + a.length, temp);
delete[] a;
a = tmp;

削除するときは、NULL または w/e を置き換え、削除マークまたは w/e に置き換えます。

于 2013-09-20T05:05:19.693 に答える