問題タブ [emplace]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
1 に答える
9582 参照

c++ - コピー不可能なオブジェクトの単一引数コンストラクターに対して map::emplace で piecewise_construct を使用する必要があるのはなぜですか?

次のコードは、gcc 4.8.2 ではコンパイルできません。問題は、このコードが構成をコピーしようとすることです。これは、コピー コンストラクターと移動コンストラクターが欠落しているstd::pair<int, A>ために発生しません。struct A

ここでgccが失敗していますか、それとも何か不足していますか?

0 投票する
3 に答える
801 参照

c++ - 配置されたunique_ptrを効率的かつエレガントに返す

( StackOverflow コメントのおかげで) コードにセキュリティ上の欠陥があることがわかりました。

基本的にItem、raw で を割り当てると、throwのnew場合にメモリ リークが発生する可能性がありますemplace_back

解決策は raw を使用することはありませんが、メソッド本体で権利newを使用しています。std::unique_ptr

ご覧のとおり、コンテナーに配置するために使用しitemて移動する必要があったため、返すことは無効です。itemstd::moveitems

itemのアドレスを追加の変数に格納する必要がある解決策は考えられません。ただし、元の(バグのある)ソリューションは非常に簡潔で読みやすいです。

std::unique_ptrコンテナに定置するために移動されたを返すよりエレガントな方法はありますか?

0 投票する
1 に答える
3457 参照

c++ - オブジェクトのマップの場合、オブジェクトを配置できますか、それともペアだけを配置できますか?

C++ 11 と gcc-4.7.0 を使用しています。STL ソリューションを探しています。

キーとして短い文字列を持つ myClass のオブジェクトを含む、並べ替えられていないマルチマップが必要です。Emplace は、オブジェクトを構築するときにオブジェクトをマップに配置するための良い方法のように見えますが、それができるかどうか、またはキー/オブジェクトのペアのみを構築するかどうかはわかりません。これは有効である必要があります:

しかし、次のことを行う方が効率的であり、有効なコードでさえありますか?

0 投票する
1 に答える
1204 参照

c++ - const メンバーを持つクラスのインスタンスを emplace_back できません

const メンバーを持つクラスのインスタンスで 'emplace_back' を使用すると問題が発生します。

以下のサンプル コード リストを参照してください。

コンパイルエラー:

次のエラー メッセージが表示されます。

代入演算子 (および移動コンストラクターとコピー コンストラクター、およびデストラクター) を定義して、暗黙的に生成された演算子が何らかの理由でプライベートにならないようにしました。それは何も変わりませんでした。この場合、代入演算子が「明示的に削除」される理由がわかりません。

クラス メンバーを非 const に変更しても、コンパイル エラーは発生しないことに注意してください。

0 投票する
2 に答える
3158 参照

c++ - std::unordered_map::emplace オブジェクトの作成

unordered_map に物を入れる 2 つの方法のいずれかを選択する過程にありました。

いくつかの実験を行って、一意の要素を挿入したときの動作 (効率など) が基本的に同等であることを確認するために、どちらのパフォーマンスが優れているかを確認しました。

ただし、重複するアイテムを挿入する場合、Value または DifferentValue の構築は自明ではないことを考えると、emplace がオブジェクトを挿入するかどうかに関係なくオブジェクトを構築することに驚きました。

そのため、デフォルトのコンストラクターには isDefaultInitialized_(true) が含まれているだけで、それ以上のものはないため、2 番目の方法が圧倒的に勝つようです。

emplace の場合、コードは次のようになります。

したがって、私は 2 番目の方法を使用しますが (移動代入と移動コンストラクターと追加のフィールドが必要な場合でも)、emplace が後で無視するオブジェクトを作成する理由には正当な理由があるのではないかと考えていました。つまり、最初にオブジェクトを作成する必要があるかどうかを確認し、既に存在する場合は早期にチェックする必要がありますか?

(私の特定のケースでは、デフォルトで初期化されたアイテムは有効と見なされないことに注意してください。そのため、質問は実際には配置に関するものです)

記録のために、23.2.4 テーブル 102 の下に何かを見つけました。

オブジェクトを作成しないことを許可すると思います。