6

特定の値がまだ に含まれていないことが確実で、そのunordered_setような値を挿入する場合、このセットend()イテレータをヒントとして渡すのは正しいですか?

編集:

コード:

#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?
}
4

3 に答える 3

11

関数を呼び出すだけでinsert、値が挿入されているか、セットにすでに存在しているかが戻り値でわかると思います。

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

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

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

于 2012-04-15T16:36:18.143 に答える
2

iterator insert ( const_iterator hint, value_type&& val );どちらがC++11のメンバーであるかを参照していると思いますunordered_setここで説明するように、hintは新しい要素を挿入する際のパフォーマンスの最適化に使用されます。新しい要素の挿入/位置はハッシュに基づいています。したがって、ハッシュがどのように生成されるかを知っている場合は、ハッシュvalue_typeを事前に生成して、コンテナーにヒントを与えることができます。

ただし、コンパイラはそれを使用しないことを決定する場合があります。したがって、私の仮説は次のとおりです。使用end()することはできますが、効果がない可能性があります。

于 2012-04-15T16:35:32.450 に答える