問題タブ [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.
c++11 - 一時オブジェクトの作成を避けるためにマップに挿入/配置する方法は?
一時オブジェクトの作成 (挿入されるオブジェクトのコンストラクター/デストラクタの呼び出し) を回避するために、項目をコンテナーに追加するときにemplace
優先するC++11 の本の 1 つからの推奨事項を読んでいます。insert
しかし、オブジェクトをマップに追加する方法がいくつかあるため、少し混乱しています。
そのようなコードを読んだときにすぐには見えない内部メカニズムもいくつか含まれています-完全な転送、暗黙的な変換...
マップ コンテナにアイテムを追加する最適な方法は何ですか?
c++ - emplace_back は代入演算子をベクトルで呼び出しますが、リストでは呼び出しません
http://www.cplusplus.com/reference/vector/vector/emplace_back/に従って 、 emplace_back は代入演算子を呼び出さずにオブジェクトを作成することを理解しました。ただし、std::vector の場合は代入演算子を呼び出し、std::list の場合は代入演算子を呼び出しません。
私のオブジェクトはコピーできません。ポインタを使用する以外に問題を回避する方法はありますか。
また、ベクトル内の消去は代入演算子を呼び出すようですが、リスト内の消去は代入演算子を呼び出しません。これは私には間違っているようでした..
std はコピーできないオブジェクトをサポートしていませんか?
c++ - 可変個引数テンプレートを使用したカスタム コンテナの配置
単純な循環ベクトル クラスを実装しています。emplace メンバー関数を実装したいのですが、理解できないエラーが発生します。私が間違っていることを簡単に修正できるかもしれませんが、可変個引数テンプレートの経験があまりないので、何が原因なのかわかりません...
私が得ているエラーは次のとおりです。
このエラーを生成するソース コードは次のとおりです (ここにもありますhttp://coliru.stacked-crooked.com/a/37d50d6f23363357 ):
c++ - 値が std::set (何かからセットへのマップ) である std::map で emplace() を使用する方法は?
問題
というstd::map<int, std::set<int>>
名前がありmisi
ます。misi.emplace(2345, {6, 9});
以下に示すように、なぜ期待どおりに動作しmisi.emplace({2345, {6, 9}});
ないのか疑問に思っています。
コード
上記は、イニシャライザ リスト コンストラクタと完全に機能std::set
することがわかります。emplace()
上記はstd::map
to のint
ものint
で、メソッドも完全に機能することがわかりますが、最後の例では、std::pair
が何らかの形で冗長である可能性があります。std::pair
はその場で構築されているのだろうか。(まあ、そうではないと思います)
astd::map
から a のstd::set
場合、イニシャライザ リスト コンストラクタは上記のように完全に機能します。しかし、そうでemplace()
はありません!(下図参照)
ここでは、次の構文は問題ありませんが、私が望んでいたことを正確には実行しません。
std::pair
ということで、インプレースを作成する方法はないようで、はインプレースstd::set
で作成されているようです (そうですか?)。誰にもアイデアはありますか?
私が使用しているコンパイラは次のとおりです。
dictionary - 地図:: V コンストラクターが 2 つのパラメーターを必要とする場所に配置
map::emplace で見つけることができるすべての例は、単一の引数を取るコンストラクターを持つかなり単純な型を使用しています。
値型コンストラクターに 2 つのパラメーターが必要であるとします。一体、本当に簡単にしましょう。値のタイプが であるとしますstd::pair<std::string, double>
。std::map<string, pair<string, double> >::emplace()
マップ内で値の型をインプレースで構築するにはどうすればよいですか?
私はこれがうまくいかないことを知っています:
少なくとも、g++ 4.8.2 では大声で失敗します。これは C++11 でも可能ですか?
c++ - emplace_back(pair) を効率的に行うには?
私は持っている
そして、保持と保持をemplace_back
持つ要素が必要です。このコンパイルを取得できる唯一の方法は、かなり不器用なものを使用することでしたpair::first
{i,j,k}
pair::second
q
これは効率的ですか (つまり、s が最適化されて除去されることが保証されていますか)? tuple
または、効率的であることが保証されている別の方法はありますか?
(私は試した
しかし、gcc 4.8.1 では役に立ちません)。定義することでこの問題を回避できることを知っています
しかし、私はそのような余分なコードなしでやりたいと思っています。
c++11 - std::vector に配置されたインスタンスのアドレスが無効です
私は2std::vector
秒持っています:
- 最初のベクトルに、インスタンスを配置します
- 2番目のベクトルに、配置したばかりのインスタンスのアドレスを格納したい
しかし、それは機能しません。つまり、格納されたアドレスは、配置されたインスタンスのアドレスとは異なります。
それが問題である場合、私は Linux を使用しており、g++ 5.1 と -std=c++11 を指定して clang 3.6 を使用しています。
問題を説明するための実際の例を次に示します。
質問
- それは正しい動作ですか?一時インスタンスのアドレスを保存していることが原因だと思いますが、標準で許可されているかどうかを知りたいです(ただ興味があります)。
- 上記が当てはまる場合、これを回避するにはどうすればよいですか? 最初のものを に変更することでこれを解決しまし
vector<unique_ptr<Foo>>
たが、慣用的な方法はありますか?
c++ - unordered_map に unordered_set を配置
unordered_set をコピーせずに、(静的に定義された) unordered_set を unordered_map に追加するにはどうすればよいですか?
私はこれを試しました:
この:
しかし、どれもコンパイルされません。(それぞれ)次のエラーが発生します。
と
boost - boost::lockfree::spsc_queue に emplace がないのはなぜですか?
レギュラーstd::vector
にはemplace_back
不要なコピーを避ける機能があります。spsc_queue
これをサポートしない理由はありますか?emplace
何らかの理由でロックフリー キューを使用することはできませんか?