std::set_intersection
берет отсортированные диапазоны элементов (ну и пары итераторов). Но предположим, у меня есть несортированные данные, например, два std::unordered_set
s. Существует ли стандартное средство их пересечения?
Там нет ярлыка в этом случае. Вы должны проверить каждый элемент меньшего набора на принадлежность к большему набору и вставить его в выходной набор, если он найден. Так как unordered_set реализован с использованием хеша с сегментами, время поиска должно (с приличной хеш-функцией и разумной максимальной загрузкой хеша) быть небольшим Вы должны быть в состоянии написать вызов for_each для меньшего набора, который выполняет проверку большего и вставки в выходной набор, не становясь слишком уродливым.
Если вы хотите построить пересечение на месте в одном из двух исходных наборов, вы можете проверить, находится ли каждый из его элементов в другом наборе, и удалить этот элемент, если нет. Это может быть записано с помощью remove_if в unordered_set, который будет содержать результат.
Еще одним вариантом будет использование copy_if с итератором вставки. Есть много вариантов сделать это в одно и то же время и пространство. Выберите тот, который, кажется, оптимизировать для ясности.
Я не знаю ни одной консервативной библиотечной функции, которая бы сделала это за вас.
Я не знаю ни одной такой функции в C ++ 11. Ответ — нет».