set/map в одном куске памяти
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 09.10.20 22:12
Оценка:
Здравствуйте!

Хочу иметь что-то типа std::set, или возможно, std::map, ключом выступает строка (голый указатель char), и чтобы всё хранилось в одном куске памяти, который статически задается, и никогда не происходит перевыделений. Если места не хватило — просто падаем.

Хочется максимально быстро искать, добавление будет производится при отсутствии ключа наверное на пару десятичных порядков реже.

Пока придумал строки класть в один кусок памяти, указатели на них (на пару с индексом/указателем полезной нагрузки) — в другой кусок памяти, полезную нагрузку — в третий кусок памяти.
При добавлении нам нужно только найти место для вставки и раздвинуть один массив с указателем-ключом или { ключ, индекс } (для мапа).

Возможно есть готовые алгоритмы/реализации получше для заданных условий?
Маньяк Робокряк колесит по городу
Re: set/map в одном куске памяти
От: scf  
Дата: 10.10.20 05:11
Оценка: +1
Здравствуйте, Marty, Вы писали:

M>Возможно есть готовые алгоритмы/реализации получше для заданных условий?


https://ru.wikipedia.org/wiki/Хеш-таблица#Открытая_адресация
Re: set/map в одном куске памяти
От: kaa.python Ниоткуда РСДН профессионально мёртв и завален ватой.
Дата: 10.10.20 07:05
Оценка: +2
Здравствуйте, Marty, Вы писали:

M>Здравствуйте!


M>Хочу иметь что-то типа std::set, или возможно, std::map, ключом выступает строка (голый указатель char), и чтобы всё хранилось в одном куске памяти, который статически задается, и никогда не происходит перевыделений. Если места не хватило — просто падаем.


А может взять готовый контейнер и к нем добавить аллокатор, который будет с твоим куском памяти работать? Мне думается это будет проще, чем не только памятью управлять, но еще и логику set/map реализовывать.
Re: set/map в одном куске памяти
От: ned Австралия  
Дата: 10.10.20 08:53
Оценка:
Здравствуйте, Marty, Вы писали:

M>Возможно есть готовые алгоритмы/реализации получше для заданных условий?


https://github.com/electronicarts/EASTL/blob/master/include/EASTL/vector_set.h
https://github.com/electronicarts/EASTL/blob/master/include/EASTL/vector_map.h
Re[2]: set/map в одном куске памяти
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.10.20 11:26
Оценка:
Здравствуйте, kaa.python, Вы писали:

M>>Хочу иметь что-то типа std::set, или возможно, std::map, ключом выступает строка (голый указатель char), и чтобы всё хранилось в одном куске памяти, который статически задается, и никогда не происходит перевыделений. Если места не хватило — просто падаем.


KP>А может взять готовый контейнер и к нем добавить аллокатор, который будет с твоим куском памяти работать? Мне думается это будет проще, чем не только памятью управлять, но еще и логику set/map реализовывать.


Теоретически можно, но тут ещё нюанс — std::map/set — это дерево, как минимум — это пара, а то и тройка указателей дополнительно. Для MCU — жирновато, хочется подешевле по памяти.
Маньяк Робокряк колесит по городу
Re: set/map в одном куске памяти
От: bnk СССР http://unmanagedvisio.com/
Дата: 10.10.20 11:37
Оценка: 5 (2) +1
Здравствуйте, Marty, Вы писали:

M>Возможно есть готовые алгоритмы/реализации получше для заданных условий?


Для строк еще есть trie, как раз для поиска
https://en.m.wikipedia.org/wiki/Trie
Re: set/map в одном куске памяти
От: PM  
Дата: 12.10.20 05:16
Оценка:
Здравствуйте, Marty, Вы писали:

M>Хочу иметь что-то типа std::set, или возможно, std::map, ключом выступает строка (голый указатель char), и чтобы всё хранилось в одном куске памяти, который статически задается, и никогда не происходит перевыделений. Если места не хватило — просто падаем.


Может быть boost::flat_map/set подойдет, если создать его с собственным аллокатором фиксированного размера, ну или посмотреть что там в boost::pool есть.
Re: set/map в одном куске памяти
От: Тёмчик Австралия жж
Дата: 17.10.20 03:55
Оценка:
Здравствуйте, Marty, Вы писали:

M>Хочу иметь что-то типа std::set, или возможно, std::map, ключом выступает строка (голый указатель char), и чтобы всё хранилось в одном куске памяти, который статически задается, и никогда не происходит перевыделений. Если места не хватило — просто падаем.


M>Хочется максимально быстро искать, добавление будет производится при отсутствии ключа наверное на пару десятичных порядков реже.


M>Пока придумал строки класть в один кусок памяти, указатели на них (на пару с индексом/указателем полезной нагрузки) — в другой кусок памяти, полезную нагрузку — в третий кусок памяти.

M>При добавлении нам нужно только найти место для вставки и раздвинуть один массив с указателем-ключом или { ключ, индекс } (для мапа).

M>Возможно есть готовые алгоритмы/реализации получше для заданных условий?


Хеш таблица
Поставь лимит на длину ключа, и выделяй память на, скажем, 2x(длина ключа + длина полезной нагрузки) максимально планируемое количество ключей. Если ключ в коллизию попал- падай. Никаких реаллокаций не делай.
Отредактировано 17.10.2020 4:03 Артём . Предыдущая версия .
Re: set/map в одном куске памяти
От: 3V Россия  
Дата: 15.01.21 22:44
Оценка:
Здравствуйте, Marty, Вы писали:

M>Теоретически можно, но тут ещё нюанс — std::map/set — это дерево, как минимум — это пара, а то и тройка указателей дополнительно.

На одном куске памяти это делается элементарно.
Вместо указателей в структурах нод — индексы в этом самом массиве нод.

M>При добавлении нам нужно только найти место для вставки и раздвинуть один массив с указателем-ключом или { ключ, индекс } (для мапа).

Ничего раздвигать не надо.
Ноды фиксированного размера.
Свободное место "ищется" за O(1) (https://en.wikipedia.org/wiki/Free_list).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.