問題タブ [stdset]
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++ - ヒントを使用して std::set に繰り返し insert() する方法は?
cplusplus.comによるとstd::set::insert()
、項目を挿入する場所のヒント イテレータを取るオーバーロードが C++98 から C++11 に変更されました。C++98 では、ヒントは次のようになります。
position が挿入された要素の前にある要素を指している場合、関数は挿入時間を最適化します。
ただし、C++11 ではヒントが変更され、次のようになります。
position が挿入された要素に続く要素 (または最後の要素の場合は最後) を指している場合、関数は挿入時間を最適化します。
ただし、C++98 でも C++11 でも、戻り値は同じです。
新しく挿入された要素、またはセット内に既に同じ値を持つ要素のいずれかを指す反復子。
C++98 の場合、次のように一連の隣接する項目を挿入するコードがあります。
これを C++11 で次のように変更できます。
しかし、C++98 から C++11 に移行するためにコードをリファクタリングする必要があることに悩まされています。ここで何か間違ったことをしているのですか、そうでない場合、この変更の動機は何だったのでしょうかinsert()
。戻り値ではありませんか?
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
で作成されているようです (そうですか?)。誰にもアイデアはありますか?
私が使用しているコンパイラは次のとおりです。
c++ - std::set の要素の変更
私は次のコードを持っています - :
出力 -:
セットの要素は、関数によってまったく変更されていませんreverse()
。
セット内の要素はまったく変更できないと思います。しかし、これが事実である場合、そもそもなぜコンパイラ自体がエラーを出さないのでしょうか?
-std=c++14
Windows 7 でフラグ付きの TDM-GCC 4.9.2 を使用しています。