11

挿入されるアイテムがすでにセットに存在するためにセット挿入が発生しないことを検出する簡単な方法はありますか?たとえば、挿入の失敗を示すメッセージをユーザーに表示して、データ内の重複をより簡単に見つけて削除できるようにしたいと思います。これが私がやりたいことを示すためのいくつかの擬似コードです:

try
{
   items.insert(item)
}

catch insert_failed_item_already_in_set
{
   // show user the failed item
}
4

8 に答える 8

21

の署名set::insertは次のとおりです。

pair<iterator,bool> insert ( const value_type& x );

したがって、コードは次のようになります。

if( !items.insert(item).second )
{   
    show user the failed item
}
于 2012-03-06T15:12:58.900 に答える
12

このinsert署名がありますstd::set

pair<iterator,bool> insert ( const value_type& x );

second返されたペアのをテストします。正常に挿入された場合はtrueに設定する必要があります。

于 2012-03-06T15:10:25.797 に答える
6

set insert return pairとして、挿入が完了したかどうかに関係なく、ブール値であるget<1>を使用してペアの2番目の要素の状態を確認できます。

if (get<1>(set.insert(x)) == false){
 //Your error log.
}
于 2014-01-17T11:33:11.090 に答える
4

cplusplusから:

insert(const T&value)を参照

最初のバージョンは、メンバーpair :: firstが、新しく挿入された要素またはセット内ですでに同じ値を持つ要素のいずれかを指すイテレータに設定されたペアを返します。ペアのpair::second要素は、新しい要素が挿入された場合はtrueに設定され、同じ値の要素が存在した場合はfalseに設定されます。

于 2012-03-06T15:12:00.570 に答える
3

STLは、要素が正常に挿入された場合はペアの2番目の値をset<>.insert(elem)返し、それ以外の場合はfalseを返します。pair<iterator,bool>true

于 2012-03-06T15:14:39.460 に答える
1

セットに対する挿入操作はペアを返し、そのメンバーfirstは、新しく挿入された要素またはセットにすでに存在する同等の要素のいずれかを指すイテレーターに設定されます。secondペアの要素はtrue、新しい要素が挿入されたfalse場合、または同等の要素がすでに存在する場合に設定されます。したがって、second要素を使用して、追加されたかどうかを判断できます。

例えば:

#include <iostream>
#include <set>
using namespace std;
int main ()
{
 std::set<int> myset;
 std::set<int>::iterator it;
 std::pair<std::set<int>::iterator,bool> ret;


 for (int i=1; i<=5; ++i) myset.insert(i*10);    // set: 10 20 30 40 50

 ret = myset.insert(20);               // no new element inserted

 if (ret.second==false)
     cout<<"Element already present";

}
于 2016-08-02T12:44:21.583 に答える
0

設定されたコンテナは重複する値を許可しないため、挿入操作では、挿入された各要素について、同じ値を持つ別の要素がコンテナにすでに存在するかどうかをチェックします。存在する場合、その要素は挿入されず、関数が値を返す場合はイテレータです。それに返されます。

ここに例があります: http ://www.cplusplus.com/reference/stl/set/insert/

于 2012-03-06T15:14:05.623 に答える
0

アイテムがすでにセットに含まれているかどうかを確認するのは簡単です。それがあなたが探している唯一のものであるならば、try/catchの必要はありません。

if ( items.find(item) == items.end() )
{
    // Item was not in the set, so put it in the set
    items.insert(item)
}
else
{
    // Item was already in the set
}

または、挿入の戻り値を確認できます。これは、ペアのsecond半分が挿入が成功したかどうかを示すペアです。

if ( false == items.insert(item).second )
{
    // Item was already in the set
}

2つの方法のうち、2番目の方法はよりコンパクトで効率的です。最初の方法では2つのルックアップが必要であり、1つはの間.findに、もう1つはの間に.insertです。

于 2012-03-06T15:50:05.967 に答える