私はstd::vector
の中にオブジェクトを格納しています。できるだけデストラクタを呼び出さないようにしたいと思います。
私は移動のものでコピーコンストラクタと割り当てを置き換える:私はこのようにそれを初期化していますなぜstd :: vector :: emplaceは、どのコンストラクタも呼び出さずにデストラクタを呼び出すのですか?
class Object
{
Object(const Object&) = delete;
Object(Object&&);
Object& operator=(const Object&) = delete;
Object& operator=(Object&&);
[...]
};
:次に
std::vector<Object> container;
container.reserve(42) // Reserve a lot in order to be sure it won't be a problem
、私は(コンストラクターが1つのint
パラメータを取る)emplace_backで2つの要素を追加します。
container.emplace_back(1);
container.emplace_back(3);
それまではすべて問題ありません。しかし、私はemplaceとの最後の前に要素を挿入したい:
auto it = container.end();
it--; // Last position.
it--; // Before last position.
container.emplace(it, 2);
しかし、ここでデストラクタが呼び出されます。
私はValgrindを使って理由を調べようとしましたが、emplace
関数が_M_insert_aux
を呼び出して私のデストラクタを呼び出しているように見えます。
どうすれば避けることができますか?
デストラクタを少なくとも1回呼び出さずに、これを行う方法を正確にどのように提案しますか? –
'emplace'は' emplace_back'と異なります。 'emplace_back'は新しい要素を作成するだけで、' emplace'は既に指定された位置に構築された要素を扱わなければなりません。 – songyuanyao
@ T.C。これはまさに私の質問です... – Aracthor