2012-04-15 8 views
4

特定の値がunordered_setにまだ含まれていないと確信できたら、この値を挿入しますか?end()イテレータをヒントとして渡すのは正しいですか?unordered_setに新しい要素を挿入します:ヒントがend()ですか?

EDIT:

コード:

#include <unordered_set> 
using namespace std; 

unordered_set<int> someset; 

int main(){ 
    auto it=someset.find(0); 
    if(it==someset.end()) someset.insert(it, 0); //correct? possible performance boost if the set is actually populated? 
} 
+0

はあなたが何を意味するか説明するためにいくつかのコードのeexampleを表示します。 – Nawaz

+3

ああああ、質問はとても簡単です...とにかく、ここにあります。 –

答えて

8

私は、単にinsert関数を呼び出すことができ、値が挿入されているのか、それとも既にそのセットに存在しているのかを返します。

auto p = someset.insert(value); 
if (!p.second) 
{ 
    std::cout << "value was already present in the set" << std::endl; 
} 

実際pのでp.second値が挿入されているかどうかを指示し、またはそれがセットに既に存在し、p.firstはあなたの値の位置を指示イテレータであり、タイプstd::pair<iterator,bool>です。

私のソリューションは全体的な作業を減らすので、これはあなたのアプローチよりも速いことに注意してください。

2

私はあなたがC++ 11のunordered_setのメンバーであるiterator insert (const_iterator hint, value_type&& val);を参照していると仮定します。記載されているように、hintは、新しい要素を挿入するときのパフォーマンスの最適化に使用されます。here新しい要素の挿入/位置は、ハッシュに基づいています。したがって、あなたのvalue_typeのためにどのようにハッシュが生成されているのか分かっていれば、それをあらかじめ生成してコンテナにヒントを与えることができます。

ただし、コンパイラは使用しないことがあります。だから私の仮説は:​​end()を使用することができますが、それは何の効果もないかもしれません。

1

私はヒントがunordered_setに役に立たない、それはunordered_mapには役に立たないのと同じ方法であると信じています。これらのメソッドは、これらのコンテナのインターフェイスを順序付きバージョンと互換性を保つために存在します(それぞれsetおよびmap)。

もっとここで読む:std::unordered_map insert with hint

関連する問題