2013-02-26 6 views
4

У меня есть N наборов чисел, скажем целых чисел. Теперь я хочу функцию, которая находит меня пересечением этих множеств. Например, для следующегоКак найти пересечение множеств

Set1 = { A, D, E, F, G, L } 
Set2 = { N, K, E, G, B, C } 
Set3 = { K, P, Q, E, F, G } 
Set4 = { Z, Y, C, G, F, E } 

Так как E и G в каждом наборе, я должен получить { E, G } как выход. Самый простой способ сделать это. Я знаю, что это не очень сложно написать собственный код, но, возможно, для этого уже есть STL или любая другая библиотечная функция, в которой я заинтересован.

+1

Судя по вашему ожидаемому результату, вы хотите * пересекается * наборы, а не _unite_ их. – Lumen

+0

Предлагаю вам ознакомиться с определениями наборов 'union' и' intersection' wrt. –

+0

Взгляните на http://rosettacode.org/wiki/Set#C –

ответ

1

См. std::set_intersection. (Как уже отмечалось в комментариях, вы, вероятно, хотите пересечения, а не союз.)

+0

«Пересечение двух отсортированных диапазонов» - его наборы не сортируются по мне ... –

+0

Возможно, его наборы отсортированы. Мы не знаем, потому что OP не смог сообщить нам о представлении C++, которое он использует. – Lumen

+0

@Pukku Я думаю, что он мог бы сделать лучше, чем это, с хэш-таблицей, если у каждого из его наборов нет повторяющихся элементов. –

3

Два возможных решения я могу думать

  1. хранить ваши наборы в векторах. Сортировку векторов с помощью std::sort и вычислить пересечение множеств с помощью std::set_intersection
  2. Храните ваши наборы в std::set, который вызывает элементы должны быть отсортированы в любом случае, и использовать std::set_intersection
+1

О, я не знал, что std :: set всегда сортируется. – MetallicPriest

+0

Это так. Класс 'std :: unordered_set', который является новым в C++ 11, представляет собой неупорядоченную версию std :: set, которая вместо сортировки использует хеш-таблицу. – Alex

Смежные вопросы