何が良い-
std::vector<MyClass*>
また
std::vector<MyClass>
?つまり、2番目のオプションはオブジェクトをヒープに格納しますか?どちらが速くてきれいですか?
std::vector<MyClass>
ほとんどの場合、これが望ましいでしょう。はい、デフォルトでオブジェクトをヒープ (動的ストレージ) に格納しますstd::allocator
。
利点は、オブジェクトがベクターの破棄時に自動的に破棄され、ヒープの断片化を削減する単一の連続したメモリ ブロックに割り当てられることです。だから、この方法はよりきれいです。
また、この方法は、メモリ割り当て操作を最小限に抑えることができるため、高速です。ベクトルはオブジェクトを構築する前にストレージを事前に割り当てます。そのため、N 個のオブジェクトの場合、M 個の割り当て操作と N 個のコンストラクター呼び出し、N > M (N が大きいほど差が大きくなります) になります。オブジェクトを手動で作成し、ポインターによってベクトルに配置すると、M 個の割り当てと N 個の構造 (M = N + X) が発生します。ここで、X はベクトル ストレージの割り当てです。また、格納されているオブジェクトの数がわかっている場合は、常にベクトル メモリの割り当てを最小限に抑えることができます - を使用しstd::vector::reserve()
ます。
逆に、ポインタを使用すると、動的に割り当てられたオブジェクトstd::vector
を呼び出すなど、オブジェクトを手動で破棄する必要があります。delete
これはお勧めできません。このようなコンテナは、非所有としてのみ使用されるものとします。この場合、オブジェクトの所有権は外部で維持されます。
はい、2 番目のバージョンもオブジェクトをヒープに格納しますが、よりコンパクトな形式、つまりMyClass
.
最初の形式では、オブジェクトの割り当てとstd::vector
割り当て解除を行う必要がありますが、2 番目のバージョンでは がこれを行います。
したがって、いつものように、それはあなたのニーズと要件に依存します. 選択できる場合は、2 番目の形式を使用します。
std::vector<MyClass>
メンテナンスがはるかに簡単です。
依存します。もちろん、クラスのコピーをコンテナーに格納する方が簡単に操作できますが、インスタンスをコンテナーに保存するたびにコピー コンストラクターを実行する必要があり、問題が発生する可能性があります。また、コンテナはその 1 つのクラス以外は格納できません。特に、基本クラスから特殊化された (継承された) 他のクラスを格納することはできません。そのため、通常、クラスへのポインターを格納する必要があります。
ポインタの格納には問題があります。ただし、両方の長所を活かすには、代わりに boost::ptr_vector を使用することを検討してください。これには、オーバーヘッドのないスマート ポインターの利点があります。
std::vector<MyClass>
オブジェクトをヒープに保存し(おそらく)、std::vector<MyClass*>
ポインターをヒープに保存し(おそらく)、オブジェクトが作成された場所に保存します。該当する場合に継承を再度std::vector<MyClass>
サポートする必要がある場合は、該当する場合はいつでも使用してください。std::vector<std::unique_ptr<MyClass>>
ベクターがオブジェクトを所有することが想定されていない場合、 はstd::vector<MyClass*>
便利ですが、そのようなケースはめったにありません。