Если я могу добавить свои 2 цента.
Прежде всего, как заметил @Potatoswatter
, если ваши элементы не являются дешевыми для копирования (встроенные / маленькие POD), вы захотите использовать указатели на оригинальные элементы, а не копировать их.
Во-вторых, доступно 2 стратегии.
- Просто убедитесь, что дубликат не вставлен в первую очередь. Это, конечно, означает управление вставкой, что обычно достигается созданием выделенного класса (с вектором в качестве атрибута).
- Когда свойство необходимо, проверьте наличие дубликатов
Я должен признать, что склонялся бы к первому. Инкапсуляция, четкое разделение обязанностей и все такое.
Во всяком случае, есть несколько способов в зависимости от требований. Первый вопрос:
- мы должны позволить элементам в
vector
в определенном порядке или мы можем "связываться" с ними?
Если мы сможем с ними связываться, я бы предложил отсортировать vector
: Loki::AssocVector
должно помочь вам начать.
Если нет, то нам нужно сохранить индекс структуры, чтобы обеспечить это свойство ... подождите минуту: Boost.MultiIndex
на помощь?
В-третьих: когда вы отметили, что простой линейный поиск удвоил, вы получите среднюю сложность O (N 2 ), которая не годится.
Если <
уже определено, то сортировка очевидна с ее сложностью O (N log N).
Может также стоить сделать T
Hashable, потому что std::tr1::hash_set
может дать лучшее время (я знаю, вам нужен RandomAccessIterator, но если T
является Hashable, то легко иметь T*
Hashable to; ))
Но, в конце концов, реальная проблема заключается в том, что наши советы являются необходимыми, потому что нам не хватает данных.
- Что такое
T
, вы хотите, чтобы алгоритм был универсальным?
- Какое количество элементов? 10, 100, 10.000, 1.000.000? Потому что асимптотическая сложность является своего рода спорным, когда имеешь дело с несколькими сотнями ....
- И, конечно: можете ли вы обеспечить уникальность во время вставки? Можете ли вы изменить сам вектор?