8

キーが正しく挿入されている場合(キーがセットにまだ存在しないことを意味します)、条件として使用しようとしてset.insert (key)いますが、続行して何らかのコードを実行する必要があります。たとえば、次のようなものです。

if (set.insert( key )) {
    // some kind of code
}

これは許されますか?コンパイラがこのエラーをスローしているため:

conditional expression of type 'std::_Tree<_Traits>::iterator' is illegal
4

3 に答える 3

14

単一のキー値を取るバージョンの insert はstd::pair<iterator,bool>、挿入が行われたかどうかを示す bool を返す必要があります。true の値は値が挿入されたことを示し、false は値がすでに存在していたことを示します。したがって、条件は次のようになります。

if( set.insert( key ).second ) {
      // code
}
于 2008-10-21T03:53:47.883 に答える
3

set::insert はペアを返します。これを試してください:

if( set.insert( key ).second ) {
    // some kind of code
}
于 2008-10-21T03:53:36.573 に答える
1

他の回答では、「.second」のみを使用することが提案されていますが、これは機能しますが、実行する必要がある処理でセット内の既存のエントリを使用する場合は、挿入の完全な結果を保存できます。

std::pair<std::set<key>::iterator, bool> iResult = set.insert (key);
if (iResult.second) {
    // some kind of code - insert took place
}
else {
    // some kind of code using iResult.first, which
    // is an iterator to the previous entry in the set.
}
于 2008-10-21T18:17:25.610 に答える