2016-03-21 11 views
3

私は2回ポップアップしてはならないデータを扱っています。そうであれば、それを検出し、それを処理する関数を呼び出す必要があります。セットで重複を検出する

現在、いくつかのデータをベクトルにプッシュしています。挿入する前に、データがそのベクトルに既に含まれているかどうかを確認する必要があります。現時点では、これは例えば

for (int i = 0; i < myVector.size() ; i++) 
{ 
    if (myVector[i] == data) 
    { 
      // invoke function 
      return false; 
    } 
} 

私はsetは一意のデータのみを許可するベクトルの特別な種類である知っている、非常に効果的ではありません。

setに重複データが追加されている(または少なくとも追加しようとしている)ことを検出する別の方法はありますか?

+0

ベクターを使用する理由はありますか? –

+0

私はそれから配列を返すよりも最適化された関数からベクトルを返しています(ここで言われたもの)。コードの他の部分では、私は構造体のベクトルを使用しますが、アイデアは同じです – Darlyn

+3

あなたの質問は明確ではありません、あなたはベクトルまたはセットを使用して重複を求めましたか? –

答えて

12

まずちょうどsetvectorの特別な種類ではないことは明らかでみましょう。これは、ベクトルに直交する一種のコンテナであり、重複を防止します。

あなたはinsertからの戻り値をチェックすることで、重複を検出することができます。

if(my_set.insert("value").second == false) { do_something_for_duplicate(); } 
6

std::setは、boolfalseであり、挿入が失敗した場合(たとえば重複値を追加した場合)です。

例:

std::set<int> set{ 1, 2, 3 }; 
auto result = set.insert(1); 
if (!result.second) 
    std::cout << "Failed to insert element!" << std::endl; 
1

あなたはstd::unordered_setを使用することができます。 insertメソッドがあります。ライブラリのバージョンによっては、挿入に関する情報(挿入が有効だった場合はboolのペア、またはすでに存在する場合はfalse)、またはイテレータなどが返されます。libのドキュメントを検索してください。

3

std::set又はstd::unordered_set標準C++ライブラリから別の容器あるがvectorはない...彼らは、異なるルールに従う:重複でないコントロール:

  • のベクターは、多かれ少なかれ可変長配列であります挿入の順序を尊重します。
  • セットには、そのデータに含まれるデータの順序が必要であり、その順序に従ってデータを参照することができます。それは自動的にも
(正確には、それも完全に決定論的であるが、使用されているハッシュ関数に依存しない)の挿入時に重複を拒否しますが、閲覧順序は一種のランダムで
  • 挿入時にunordered_setを重複を拒否する既に値が含まれているかどうかを確認する簡単な方法であるベクター、(ref)について

    :unordered_setのセットについて

    std::find(vector.begin(), vector.end(), item) != vector.end() 
    

    、挿入方法は、要素を指すペアイテレータを返す - ブール値はどこに示しますすでに存在しているかどうかにかかわらず追加されました

    if (! my_set.insert(data).second) { 
        // invoke function 
        return false; 
    } 
    
  • 関連する問題