Очевидно, что вы можете сделать это просто с помощью контейнера, похожего на очередь, но вам придется тратить O(n)
время на каждую вставку, чтобы определить, присутствует ли элемент уже. Если вы реализуете свою очередь на основе чего-то вроде std::vector
, вы можете использовать бинарный поиск и в основном ускорить вставку до O(log n)
(для этого все равно потребуется O(n)
операций, когда перераспределение памяти выполнено).
Если это хорошо, просто придерживайтесь его. Вариант с дополнительным контейнером может повысить производительность, но он также может быть подвержен ошибкам при написании, и если первого решения достаточно, просто используйте его.
Во втором сценарии вы можете захотеть хранить ваши элементы дважды в разных контейнерах - исходная очередь и что-то вроде карты (или иногда hashmap может работать лучше). Карта используется только для определения того, присутствует ли элемент в контейнере или нет - и если ДА, вам придется обновить его в своей очереди.
По сути, это дает нам O(1)
сложность для поиска по хэш-карте (в реальном мире это может стать уродливее из-за коллизий - хеш-карты не очень хороши для определения существования элемента) и O(1)
время вставки для случая, когда обновление не требуется и требуется O(n)
время вставки для обновления дела.
Исходя из процента фактических операций обновления, фактическая производительность вставки может варьироваться от O(1)
до O(n)
, но эта схема определенно превзойдет первую, если количество обновлений достаточно мало.
Тем не менее, вы должны вставить свои элементы в два контейнера одновременно, и то же самое должно быть сделано, если элемент удален, и я бы дважды подумал: «Мне действительно нужно это повышение производительности?».