2012-03-06 5 views
2

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

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

テスト返されたペアのsecondであり

try 
{ 
    items.insert(item) 
} 

catch insert_failed_item_already_in_set 
{ 
    // show user the failed item 
} 
+0

http://www.cplusplus.com/reference/stl/set/insert/あなたのC++標準ライブラリの参照と間違っ – UmNyobe

+2

何か:たとえば

?使用している関数の戻り値の型を調べることさえできません。申し訳ありません質問のために –

+0

。私はセットをあまり使わなかった。私はデータ構造をよく知っていますが、C++がどのように挿入エラーを検出したかはわかりません。私はこれらの質問をもうここでは尋ねません。答えに時間を割いたすべての人に感謝します。 – 01100110

答えて

8

、trueに設定する必要があります挿入が成功した場合。 cplusplusから

+0

ありがとうございます!私はセットをあまり使わなかった。私は参考に感謝します。それは動作します。 – 01100110

4

:(CONST T &値)を挿入する参照

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

13

set::insertのシグネチャは次のとおりです。それぞれの

if(!items.insert(item).second) 
{ 
    show user the failed item 
} 
+0

訂正; 'set :: insert'の_a_シグニチャ –

+0

あなたはもちろんです。 –

0

セットコンテナが重複する値を許可していないので、挿入動作確認:

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

だから、あなたのコードは次のようになります。要素が挿入されていない場合はその要素が既に値を持つコンテナ内に存在するかどうかにかかわらず挿入され、関数が値を返す場合は反復子が返されます。

あなたはここで例を見つけることができます:要素が正常にそれ以外の場合はfalseを挿入した場合にはペアの2番目の値がtrueあるpair<iterator,bool>を返しset<>.insert(elem) http://www.cplusplus.com/reference/stl/set/insert/

2

STLを。

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 
} 

、第二の第1の方法は、2つのルックアップを必要とするので、よりコンパクトで効率的である.1つは.findの間にあり、もう1つは.insertの間である。

4

設定された挿入リターンペアでは、挿入が完了した場合にブール値である<>を使用してペアの2番目の要素の状態を確認できます。セットに

if (get<1>(set.insert(x)) == false){ 
//Your error log. 
} 
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"; 

} 
関連する問題