std :: set_intersection для отсортированных диапазонов, как [_] для несортированных диапазонов / контейнеров

std::set_intersection берет отсортированные диапазоны элементов (ну и пары итераторов). Но предположим, у меня есть несортированные данные, например, два std::unordered_sets. Существует ли стандартное средство их пересечения?

2

Решение

Там нет ярлыка в этом случае. Вы должны проверить каждый элемент меньшего набора на принадлежность к большему набору и вставить его в выходной набор, если он найден. Так как unordered_set реализован с использованием хеша с сегментами, время поиска должно (с приличной хеш-функцией и разумной максимальной загрузкой хеша) быть небольшим Вы должны быть в состоянии написать вызов for_each для меньшего набора, который выполняет проверку большего и вставки в выходной набор, не становясь слишком уродливым.

Если вы хотите построить пересечение на месте в одном из двух исходных наборов, вы можете проверить, находится ли каждый из его элементов в другом наборе, и удалить этот элемент, если нет. Это может быть записано с помощью remove_if в unordered_set, который будет содержать результат.

Еще одним вариантом будет использование copy_if с итератором вставки. Есть много вариантов сделать это в одно и то же время и пространство. Выберите тот, который, кажется, оптимизировать для ясности.

Я не знаю ни одной консервативной библиотечной функции, которая бы сделала это за вас.

1

Другие решения

Я не знаю ни одной такой функции в C ++ 11. Ответ — нет».

2

По вопросам рекламы [email protected]