2017-03-20 7 views
0

重複を防ぐには、unordered_setを使用することをお勧めします。しかし、unordered_set<vector<string>>が必要な場合、この方法は機能していないようです。これをやり遂げるにはどうすればいいですか?たとえば、<"a", "b", "c">が私のunordered_set<vector<string>>に複製されないようにします。タイプベクトル<string>の重複をC++で削除するには?

このunordered_set<vector<string>>も定義されたクラス外で使用できますか?

コード:

unordered_set<vector<string>> abc({"apple", "ball", "carrot"}); 
abc.insert({"apple", "ball", "carrot"}); 

cout << abc.size() << endl;  //abc.size() should be 1 
+0

私は自分自身でハッシュを定義しなければならないと思いますか?しかし、どうすればいいのか分かりません。 –

+3

{"a"、 "b"、 "c"}を2回追加し、セットのサイズ()を確認する非常に最小限の例を投稿できますか? –

+0

'unordered_set >' –

答えて

0

重複を取り除くために、いくつかの方法があり、あなたのオブジェクトのうちのセットを構築することは、それらの一つです。 std::setstd::unordered_setかどうかは、決定するまでは決まっています。その決定は、通常、ハッシュ関数の有効性に依存します。

これはドメインの知識を必要とします。文字列のベクトルは何を表し、どのような値を持つことができます。あなたは良いハッシュを思い付く行う場合、あなたはこのようにそれを実装することができます

struct MyHash 
{ 
    std::size_t operator()(std::vector<std::string> const& v) const 
    { 
     // your hash code here 
     return 0; // return your hash value instead of 0 
    } 
}; 

次に、あなただけでは、ハッシュを使用してunordered_setを宣言:私はそれだけに安全な賭けだと言うだろう

std::unordered_set<std::vector<std::string>, MyHash> abc; 

あなたはあなたの心に良いハッシュ関数を持っていない限り、最初にstd::setと行く。