32

次のような、通常の Base -> Derived 階層を持つ:

class Fruit { ... };
class Pear : Fruit { ... };
class Tomato : Fruit { ... };

std::vector<Fruit*> m_fruits;

emplace_backの代わりに使用するのは理にかなっていますか (例: パフォーマンスが向上しますか) push_back?

std::vector::emplace_back( new Pear() );
std::vector::emplace_back( new Tomato() );
4

2 に答える 2

33

生のポインターを使用しないでくださいstd::unique_ptr。次のように使用します。

std::vector<std::unique_ptr<Fruit>> m_fruits;

また、コンストラクト astd::unique_ptrをコピーできないため、使用する必要がありますemplace_back(ただし、push_backと共に使用することはできますstd::move)。

m_fruits.emplace_back(new Pear());
m_fruits.emplace_back(新しいトマト());

編集:

std::vector<std::unique_ptr<T>>::emplace_backand を使用すると、メモリの再割り当てが必要で失敗したnew場合にリークする可能性があるように見えるためstd::vector、私の推奨されるアプローチ (C++14 が導入されるまでstd::make_unique) は、push_back次のように使用することです。

m_fruits.push_back(std::unique_ptr<Fruit>(new Pear()));
m_fruits.push_back(std::unique_ptr<Fruit>(new Tomato()));

または使用std::make_unique

m_fruits.push_back(std::make_unique<Pear>());
m_fruits.push_back(std::make_unique<Tomato>());
于 2013-04-03T10:24:34.740 に答える