2017-12-23 21 views
1

emplace_hintのset/mapメソッドは、実際にアイテムが追加されたかどうかを判断するイテレータのみを返すので、emplaceまたはinsertを使用する場合ほど便利ではありません。今私はちょうど/後の前にコンテナのサイズを取得し、それらを比較:emplace_hint使用時にアイテムが追加されたかどうかを調べる

::std::map<int, int> items{}; 
const auto initial_items_count{items.size()}; 
const auto it_item{items.emplace_hint(items.begin(), 0, 5)}; 
if(items.size() != initial_items_count) 
{ 
    // perform additional actions... 
} 

それはペアを返すヘルパーに包ますることができ、多分、既存の単純なアプローチはありますか?

+0

私は、通常、 'emplace_hint'と' lower_bound'の結果を結合するという考えを想像しています。その情報が行為の前に利用できるようにする。それ以外の場合、 'emplace_hint'は通常の' emplace'よりも保証されません。 – StoryTeller

+1

'lower_bound'トリックは、PODのコンテナの良いアプローチです。クラスのコンテナの場合、コンストラクタが設定する 'bool&'というコンストラクタに対する追加のパラメータを常に持つことができます。 'emplace_hint'が返ってくると、' bool'の内容をチェックすることで、オブジェクトが構築されたかどうかがわかります。 –

+0

@StoryTeller私の状況では、挿入される値は単調に減少していますが、値のかなりの部分は途中で変わりません。また、これらの値はやや重いので、コードを単純にして、常に 'begin'をヒントとして提供することにしました(常に最適ではないにもかかわらず、' emplace'に比べてパフォーマンスが向上します)。 – VTT

答えて

1

map::sizeがO(1)(標準あたり)であるとすれば、このアプローチ(特にmap::emplaceの復帰を模倣したヘルパー)は妥当であると私は信じています。

+0

あなたは、そのような小さなスタンドアロンラッパーを追加することは、それなしで行うよりもほぼ同じ量の気になることが分かります。余分な一時変数を取り除くのに役立ちますが、代わりに、余分なインクルードといくつかの依存関係管理を気にします。これは実際には大きな問題ではありませんが、私は同じようなコードを何度も書いたことに気付きました。 – VTT

関連する問題