1

何が良い-

std::vector<MyClass*>

また

std::vector<MyClass>

?つまり、2番目のオプションはオブジェクトをヒープに格納しますか?どちらが速くてきれいですか?

4

4 に答える 4

5

std::vector<MyClass>ほとんどの場合、これが望ましいでしょう。はい、デフォルトでオブジェクトをヒープ (動的ストレージ) に格納しますstd::allocator

利点は、オブジェクトがベクターの破棄時に自動的に破棄され、ヒープの断片化を削減する単一の連続したメモリ ブロックに割り当てられることです。だから、この方法はよりきれいです。

また、この方法は、メモリ割り当て操作を最小限に抑えることができるため、高速です。ベクトルはオブジェクトを構築する前にストレージを事前に割り当てます。そのため、N 個のオブジェクトの場合、M 個の割り当て操作と N 個のコンストラクター呼び出し、N > M (N が大きいほど差が大きくなります) になります。オブジェクトを手動で作成し、ポインターによってベクトルに配置すると、M 個の割り当てと N 個の構造 (M = N + X) が発生します。ここで、X はベクトル ストレージの割り当てです。また、格納されているオブジェクトの数がわかっている場合は、常にベクトル メモリの割り当てを最小限に抑えることができます - を使用しstd::vector::reserve()ます。

逆に、ポインタを使用すると、動的に割り当てられたオブジェクトstd::vectorを呼び出すなど、オブジェクトを手動で破棄する必要があります。deleteこれはお勧めできません。このようなコンテナは、非所有としてのみ使用されるものとします。この場合、オブジェクトの所有権は外部で維持されます。

于 2012-11-03T20:50:24.073 に答える
4

はい、2 番目のバージョンもオブジェクトをヒープに格納しますが、よりコンパクトな形式、つまりMyClass.

最初の形式では、オブジェクトの割り当てstd::vector割り当て解除を行う必要がありますが、2 番目のバージョンでは がこれを行います。

したがって、いつものように、それはあなたのニーズと要件に依存します. 選択できる場合は、2 番目の形式を使用します。

std::vector<MyClass>

メンテナンスがはるかに簡単です。

于 2012-11-03T20:44:24.943 に答える
0

依存します。もちろん、クラスのコピーをコンテナーに格納する方が簡単に操作できますが、インスタンスをコンテナーに保存するたびにコピー コンストラクターを実行する必要があり、問題が発生する可能性があります。また、コンテナはその 1 つのクラス以外は格納できません。特に、基本クラスから特殊化された (継承された) 他のクラスを格納することはできません。そのため、通常、クラスへのポインターを格納する必要があります。

ポインタの格納には問題があります。ただし、両方の長所を活かすには、代わりに boost::ptr_vector を使用することを検討してください。これには、オーバーヘッドのないスマート ポインターの利点があります。

于 2012-11-03T20:54:18.737 に答える
0

std::vector<MyClass>オブジェクトをヒープに保存し(おそらく)、std::vector<MyClass*>ポインターをヒープに保存し(おそらく)、オブジェクトが作成された場所に保存します。該当する場合に継承を再度std::vector<MyClass>サポートする必要がある場合は、該当する場合はいつでも使用してください。std::vector<std::unique_ptr<MyClass>>ベクターがオブジェクトを所有することが想定されていない場合、 はstd::vector<MyClass*>便利ですが、そのようなケースはめったにありません。

于 2012-11-03T20:54:25.583 に答える