2016-08-04 20 views
1

ここに私の問題があります:std::vector<std::unordered_set<int>>があります。それらの順序付けられていないセットのいくつかは同じですが、同じ順序ではありません(順序はunordered_setで曖昧です)。重複を削除するには(例えば{1,3,2} == {3,2,1}の数学的意味で)、私はstd::unique()を使うことを考えましたが、うまくいきません。検索後、私はベクトルのデータをソートする必要があることに気付きましたが、この場合は意味がありません。 std::vector<std::unordered_set<int>>に重複を削除する機能はありますか?私は自分でそれをすることができます私はstlで何かを逃したかどうかを知りたい。また、別の容器を使ってこの問題を解決する方法を知っていれば教えてください。ここでは効率は大きな問題ではなく、この文脈ではそのベクトルには200以上の要素がありません。std :: unique()をstd :: vectorで使用する<std :: unordered_set <T>>

TLDR; std::vector<std::unordered_set<int>>で重複を削除するにはどうすればよいですか?

+0

'set 'に' unordered_set'を使用する理由はありますか? 'set'を使用した場合、同じ要素を含む2つのセットは同じ順序になります。 – NathanOliver

+0

O(n^2)時間で重複を削除するには、各配列要素を他の配列要素と(等価のために)比較します。 –

答えて

1

効率は、その後の野生を手放すここ

大きな問題ではありません! setにはoperator<が定義されています。

std::vector<std::unordered_set<int>> v = ...; 
std::sort(v.begin(), v.end(), [](auto const& lhs, auto const& rhs){ 
    return std::set<int>(lhs.begin(), lhs.end()) < 
     std::set<int>(rhs.begin(), rhs.end()); 
}); 
v.erase(std::unique(v.begin(), v.end()), v.end()); 

実行時にはかなり間違いがありますが、動作します。


それともunordered_set<unordered_set<int>>を作り、あなたが開始するために、こののいずれかを実行する必要がないように順序に依存しないのハッシュを思い付くことができます。

+0

効率が重要な場合は、 'boost :: multi_index'を使い、同時に順序付けされていない順序付けされたアクセスを行う方が簡単だと思います。 – Slava

+0

'std :: unique'は重複を検出するために同じラムダを必要としませんか? – Slava

+0

@Slava 'unique'の述語は、2つの要素が等しいかどうかを比較することです。 'unordered_set'はすでにEqualityComparableです。 – Barry

0

ありがとうございます。私はそれが本当に最も簡単だと思うので、n.mアドバイスに従った。 このようになります:

std::vector<std::set<int>> resultP; 
............................................... 
// Remove the duplicate (without order), we want combinations not permutations. 
std::vector<std::set<int>> resultC; 
bool permAlreadyThere = false; 
for (auto& perm : resultP) 
{ 
    for (auto& comb : resultC) 
    { 
     if (perm == comb) 
     { 
      permAlreadyThere = true; 
      break; 
     } 
    } 
    if (!permAlreadyThere) resultC.push_back(perm); 
    permAlreadyThere = false; 
} 
+0

'unordered_set'から' set'に移動すると、代わりにソートしてユニークにすることができます... – Yakk

関連する問題