Когда вам нужно сделать заказ, используйте заказанный контейнер. Нет смысла оплачивать стоимость сортировки позже.
Ваше текущее решение:
- Вставка
O(1)
- индексирование
O(N log N)
- Удаление
O(N)
(который так же хорошо, как вы можете получить без сохранения другого индекса там)
Просто используя a std::multi_map
, вы могли бы:
- Вставка
O(log N)
- индексирование
O(log N)
< - гораздо лучше, не так ли? Нам нужно найти конец диапазона
- Удаление
O(N)
Теперь, вы могли бы сделать немного лучше с std::map< key, std::vector<value> >
:
- Вставка
O(log M)
где M
является число различных ключей
- Возвращение
O(1)
(begin
ожидается на постоянной основе)
- Снятие
O(N)
Вы не можете надавить на случайное удаление ... если только вы не захотите сохранить там еще один индекс. Например:
typedef std::vector<value_type> data_value_t;
typedef std::map<key_type, data_value_t> data_t;
typedef std::pair<data_t::iterator,size_t> index_value_t;
// where iterator gives you the right vector and size_t is an index in it
typedef std::unordered_map<value_type, index_value_t> index_t;
Но держать этот второй показатель до настоящего времени ошибок, ... и будет сделано за счет других операций! Например, с этой структурой, вы бы:
- Вставка
O(log M)
-> сложность вставки в хэш-карта является O(1)
- индексирование
O(N/M)
-> нужно отменить индексных все значения в векторе, там в среднем
- удаление
O(N/M)
N/M
-> нахождение в хэш-карте O(1)
, разыменования O(1)
, удаление из вектора O(N/M)
, потому что нам нужно перенести примерно половину содержимого вектора. Использование list
даст O(1)
... но может быть не быстрее (зависит от количества элементов из-за недостатка памяти).
Также учтите, что сложность хэш-карты является амортизированной. Запустите перераспределение, потому что вы перегрузили коэффициент загрузки, и эта конкретная вставка займет очень много времени.
Я бы пошёл с std::map<key_type, std::vector<value_type> >
вместо вас. Это лучший удар для доллара.
«вектор» вместо «списка», если только у вас действительно много элементов. –
Вы хотите гарантировать уникальность 'value' или есть что-то еще, что позаботится об этом? –
Не нужно гарантировать уникальность 'value'. ps .: Я вижу, что вы французский, из-за пространства до '?' :-) –