LINUX.ORG.RU

Есть ли в стандартных типах тип списка полублочный полусвязанный?

 


0

4

Есть ли в стандартных типа с++ такой тип списка, который выделяет память одним блоком, но в то же время при расширении вместимости не перевыделяет его, а выделяет добавочный блок. Но в то же время не связанный список, т.к. на полную связанность требуется дополнительная память, и он долго работает на получение по индексу. В случае выделения блоками там будет побыстрее чем в чисто связанном. А с перевыделением проблема, что когда перевыделяются большие списки, то дефрагментация памяти, а потом bad_alloc. В общем, есть ли такой список полублочный, полусвязанный?

который выделяет память одним блоком, но в то же время при расширении вместимости не перевыделяет его
Но в то же время не связанный список

std::vector?

Makhno
()

std::deque

Но так или иначе надо делать тесты производительности в плюс-минус реальных условиях. Надо проверять, может таки перевыделение в векторе не настолько сильно испортит ситуацию — ядро ОС вместе с аллокатором таки могут немного изменить расклад...

jeuta ★★★★
()
Последнее исправление: jeuta (всего исправлений: 1)

+1 за deque

Но нужно помнить, что блоки в нем изначально довольно большого размера.

anonymous
()
Ответ на: комментарий от jeuta

std::deque известен своей тормознутостью, несмотря на то, что асимптотическая сложность у него хорошая. В большинстве случаев лучше просто изпользовать vector.

rupert ★★★★★
()
Ответ на: комментарий от rupert

Как раз с vector я и имею проблему, пришлось заменить на map<int,XX>.

А deque согласно документации это как раз обычный двухсвязанный список.

victor79
() автор топика
Ответ на: комментарий от victor79

https://en.cppreference.com/w/cpp/container/deque

...deques typically have large minimal memory cost; a deque holding just one element has to allocate its full internal array (e.g. 8 times the object size on 64-bit libstdc++; 16 times the object size or 4096 bytes, whichever is larger, on 64-bit libc++). ...

Двусвязный список, но из блоков по 8 (gcc) или 16 (clang) элементов

jeuta ★★★★
()
Последнее исправление: jeuta (всего исправлений: 1)
Ответ на: комментарий от victor79

посмотри в сторону boost.pool.

но если тебе надо что-то сильно специфическое - нужно писать самому. там не так много работы. такая задача довольно часто встречается. но проблема именно в специфике и требованиях конкретной реализации.

Iron_Bug ★★★★★
()
Ответ на: комментарий от victor79

А deque согласно документации это как раз обычный двухсвязанный список.

Как обычный двусвязный список может иметь доступ по индексу за O(1)?

anonymous
()
Ответ на: комментарий от anonymous

Тоже сначала удивился, но потом вспомнил что мы же в интернете)))

jeuta ★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.