STL: multimap?
От: Аноним  
Дата: 01.03.05 07:20
Оценка:
Привет!

Есть пара вопросов о multimap:
1. Как можна при создании multimap, зарезервировать под него место, так что бы при вставке нового элемента не тратилось время на выделение памяти? Просто очень много вставок в процессе работы...
2. Можна ли в процессе работы менять ключ элемента? Если да, то как?
3. Как ускорить процесс удаления элементов, у меня в мультимапе куча стрингов и профайлер показывает что процесс удаления этих стрингов дольше выполняется чем сам процесс их обработки...

Спасибо!
Re: STL: multimap?
От: MaximE Великобритания  
Дата: 01.03.05 07:37
Оценка:
wrote:

> 1. Как можна при создании multimap, зарезервировать под него место, так что бы при вставке нового элемента не тратилось время на выделение памяти? Просто очень много вставок в процессе работы...


Использовать собственный allocator, который будет выделять память из превыделенного пула.

Альтернативный вариант — map_light. Использовать в качестве контейнера отсортированный vector, для поиска использовать equal_range, для вставки upper/lower_bound.

> 2. Можна ли в процессе работы менять ключ элемента? Если да, то как?


Можно, но не inplace. Удалить элемент, изменить ключ, снова вставить.

> 3. Как ускорить процесс удаления элементов, у меня в мультимапе куча стрингов и профайлер показывает что процесс удаления этих стрингов дольше выполняется чем сам процесс их обработки...


Тут варианты зависят от задачи.

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[2]: STL: multimap?
От: Аноним  
Дата: 01.03.05 07:51
Оценка: :)
Здравствуйте, MaximE, Вы писали:

ME>wrote:


>> 1. Как можна при создании multimap, зарезервировать под него место, так что бы при вставке нового элемента не тратилось время на выделение памяти? Просто очень много вставок в процессе работы...


ME>Использовать собственный allocator, который будет выделять память из превыделенного пула.


Весело... Еще менеджер памяти самому писать


ME>Альтернативный вариант — map_light.

А где он этот map_light?

ME>Использовать в качестве контейнера отсортированный vector, для поиска использовать equal_range, для вставки upper/lower_bound.


А разве такой есть, что то не могу вспомнить...


>> 2. Можна ли в процессе работы менять ключ элемента? Если да, то как?


ME>Можно, но не inplace. Удалить элемент, изменить ключ, снова вставить.


Так и делаю по сути, но что мне это не нравится...

>> 3. Как ускорить процесс удаления элементов, у меня в мультимапе куча стрингов и профайлер показывает что процесс удаления этих стрингов дольше выполняется чем сам процесс их обработки...


ME>Тут варианты зависят от задачи.


Я и сам не могу понять, почему delete всех элементов так долго работает, помоему delete должна быть очень простой операцией...
Re[3]: STL: multimap?
От: Bell Россия  
Дата: 01.03.05 07:58
Оценка:
Здравствуйте, Аноним, Вы писали:

ME>>Использовать собственный allocator, который будет выделять память из превыделенного пула.


А>Весело... Еще менеджер памяти самому писать

Любишь кататься...
Попробуй STLPort — у него достаточно продвинутые аллокаторы.

ME>>Использовать в качестве контейнера отсортированный vector, для поиска использовать equal_range, для вставки upper/lower_bound.


А>А разве такой есть, что то не могу вспомнить...

Обычный вектор превращается в сортированный простым мановением std::sort Впрочем, можно обратить свой взор на AssocVector из Loki.

ME>>Можно, но не inplace. Удалить элемент, изменить ключ, снова вставить.

А>Так и делаю по сути, но что мне это не нравится...
А что делать? Такова суровая правда жизни...


А>Я и сам не могу понять, почему delete всех элементов так долго работает, помоему delete должна быть очень простой операцией...

К сожалению это не так.
Любите книгу — источник знаний (с) М.Горький
Re[4]: STL: multimap?
От: MaximE Великобритания  
Дата: 01.03.05 08:08
Оценка:
Bell wrote:

> А>А разве такой есть, что то не могу вспомнить...

> Обычный вектор превращается в сортированный простым мановением std::sort Впрочем, можно обратить свой взор на AssocVector из Loki.

Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.

Хотя вполне может оказаться, что нужно вставить большое количество элементов до того момента как будет производиться поиск. В этом случае может оказаться эффективнее набить вектор, затем его отсортировать.

Хотя опять же, сложность lower_bound — гарантировано log2(n), быстрой сортировки std::sort — в среднем c * n * log2(n), в худшем — n ** 2...

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[5]: STL: multimap?
От: Bell Россия  
Дата: 01.03.05 08:14
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Bell wrote:


>> А>А разве такой есть, что то не могу вспомнить...

>> Обычный вектор превращается в сортированный простым мановением std::sort Впрочем, можно обратить свой взор на AssocVector из Loki.

ME>Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.


Да я не спорю — просто я упоманул про std::sort в овет на фразу "А разве такой есть"...
Любите книгу — источник знаний (с) М.Горький
Re[5]: STL: multimap?
От: WolfHound  
Дата: 01.03.05 08:44
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.

А потом придется использовать вставку в вектор со сложностью O(N)

ME>Хотя опять же, сложность lower_bound — гарантировано log2(n), быстрой сортировки std::sort — в среднем c * n * log2(n), в худшем — n ** 2...

Не lower_bound не катит ибо ты забыл еще и про вставку... А std::sort в томже STLPort реализован через IntroSort у которого нет проблем с худшим случаем.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[6]: STL: multimap?
От: MaximE Великобритания  
Дата: 01.03.05 09:01
Оценка:
WolfHound wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.

> А потом придется использовать вставку в вектор со сложностью O(N)


> ME>Хотя опять же, сложность lower_bound — гарантировано log2(n), быстрой сортировки std::sort — в среднем c * n * log2(n), в худшем — n ** 2...

> Не lower_bound не катит ибо ты забыл еще и про вставку...

Я не забыл. Вставка в вектор занимает амортизированное константное время — O(1).

> А std::sort в томже STLPort реализован через IntroSort у которого нет проблем с худшим случаем.


И что это за алгоритм такой — IntroSort? Два года назад std::sort был реализован как quick sort с оптимизациями по размеру стэка и малых массивов (<25).

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re[7]: STL: multimap?
От: WolfHound  
Дата: 01.03.05 09:15
Оценка: 11 (1)
Здравствуйте, MaximE, Вы писали:

ME>Я не забыл. Вставка в вектор занимает амортизированное константное время — O(1).

Чего??? Втавка и уделение из вектора с сохранением порядка элементов всегда были O(N). Это вставка/удаление с конца амортизированая константа, а из произвольного места O(N)

ME>И что это за алгоритм такой — IntroSort?

Он для кврадратичных случаев переключается на heapsort. И вобще гугль тебе в помощь.

ME>Два года назад std::sort был реализован как quick sort с оптимизациями по размеру стэка и малых массивов (<25).

Не знаю куда ты там смотрел. Посмотри в последний STLPort
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[8]: STL: multimap?
От: MaximE Великобритания  
Дата: 01.03.05 09:26
Оценка:
WolfHound wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Я не забыл. Вставка в вектор занимает амортизированное константное время — O(1).
> Чего??? Втавка и уделение из вектора с сохранением порядка элементов всегда были O(N). Это вставка/удаление с конца амортизированая константа, а из произвольного места O(N)

Да, я не прав.

23.2.4
A vector is a kind of sequence that supports random access iterators. In addition, it supports (amortized) constant time insert and erase operations at the end; insert and erase in the middle take linear time. Storage management is handled automatically, though hints can be given to improve efficiency.


--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
Re: STL: multimap?
От: Кодт Россия  
Дата: 01.03.05 10:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть пара вопросов о multimap:

А>1. Как можна при создании multimap, зарезервировать под него место, так что бы при вставке нового элемента не тратилось время на выделение памяти? Просто очень много вставок в процессе работы...

Аллокатор, скажем, поверх вектора (чтобы абстрагироваться от настоящего менеджера памяти). Не такая уж это тяжёлая задача.

А>2. Можна ли в процессе работы менять ключ элемента? Если да, то как?


В принципе, можно было бы поддержать такую фичу (узел из дерева отцепляется, вставляется в новое место, выполняется перебалансировка), но STL такого механизма не содержит. Придётся удалять-вставлять.

А>3. Как ускорить процесс удаления элементов, у меня в мультимапе куча стрингов и профайлер показывает что процесс удаления этих стрингов дольше выполняется чем сам процесс их обработки...


Половина тормозов уйдёт, если стринги будут пользоваться Copy-On-Write. Если твой STL так не делает — пиши рукодельный класс строки либо пользуйся, например, shared_ptr'ами (только аккуратно, чтобы случайно не перековырять разделяемые данные).
Перекуём баги на фичи!
Re[5]: STL: multimap?
От: Serhio Россия  
Дата: 04.03.05 11:01
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.


ME>Хотя опять же, сложность lower_bound — гарантировано log2(n), быстрой сортировки std::sort — в среднем c * n * log2(n), в худшем — n ** 2...


А вставку элемента в середину вектора, в случае использования upper/lower_bound, вы учли?
Re[6]: STL: multimap?
От: MaximE Великобритания  
Дата: 04.03.05 11:34
Оценка:
Serhio wrote:

> Здравствуйте, MaximE, Вы писали:

>
> ME>Возможно, что сортировать вектор не очень удачное решение, по сравнению с использованием upper/lower_bound. После вставки sort будет перелопачивать весь массив, lower_bound же найдет тебе нужное место вставки бинарным поиском.
>
> ME>Хотя опять же, сложность lower_bound — гарантировано log2(n), быстрой сортировки std::sort — в среднем c * n * log2(n), в худшем — n ** 2...
>
> А вставку элемента в середину вектора, в случае использования upper/lower_bound, вы учли?

log2(n) + c * n / 2

--
Maxim Yegorushkin

Those who do not understand Unix are condemned to reinvent it, poorly. © Henry Spencer
Posted via RSDN NNTP Server 1.9
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.