Comments 12
If the current item in the first collection is the same as the current item in the second collection, it gets added to the result the algorithm just moves on to the next item in both collections
после «to the result» должна быть точка с запятой. Соответственно, перевод становится намного яснее:
Если актуальный элемент в первой коллекции равен актуальному элементу во второй коллекции, он добавляется к результату; после этого алгоритм перемещается к следующему элементу в обеих коллекциях.
Бррр… Вот что бывает, когда в задаче обработки данных берёшь за основу алгоритмы, а не структуры данных.
Сразу бы начал с третьего алгоритма, просто потому, что у нас два set. И про потери времени на построение unordered_set не думал бы, ибо строился бы он по мере получения данных. И уже потом при необходимости подумал про оптимизацию.
А взять два вектора, отсортировать их и слить — это типичное натягивание совы на глобус.
Заголовок не отображает содержание. Статья иллюстрирует мысль, что использовать STL как реализацию необходимых алгоритмов — хорошо, а сводить необходимые для задачи алгоритмы к имеющимся в STL реализациям — скорее плохо. Не ново, но полезно напомнить.
Если не эффективная реализация «в лоб» работает 0.1 сек, а эффективная 0.01 сек, то какая, в общем, разница, если это «продукт для разработчиков» — в любом случае, время работы меньше времени реакции человека.
В каких-то случаях, безусловно, эта разница будет существенной.
Но вообще, идея достаточно правильная — не всегда надо комбинировать готовые библиотечные функции. Иногда, если понятно зачем это нужно, стоит и сортировку вручную написать.
В unordered_intersection_2
первый return
как-то не согласуется со вторым. Кто знает, может быть std::copy_if
возвращает не void
, это надо в справочнике ещё лезть смотреть.
Наверное, я поздно пишу, но ваш алгоритм с сортировкой никогда не будет правильно работать. Если на вход подать две множества {0}, {0, 0}, то результатом будет {0, 0}, потому что вы не проверяете, какие данные уже были обработаны. Без дополнительных выделений памяти в такой реализации не обойтись. В стандартном алгоритме, где оба множества отсортированы, вы работаете только с теми данными, которые еще не использовались, это реализовано с помощью движения двух лент в торону. Данные, которые слева от "считывателя" уже не могут повлиять на результат и ответом такого алгоритма будет множество только из одного элемента {0}.
Когда не стоит пользоваться алгоритмами STL. Пример с множествами