В связи с особыми требованиями [*] мне нужна реализация односвязного списка, которая использует целочисленные индексы вместо указателей для связи узлов. Индексы всегда интерпретируются относительно вектора, содержащего узлы списка.
Я думал, что мог бы достичь этого, определив свой собственный распределитель, но, глядя на реализацию gcc, они явно используют указатели для полей ссылки в узлах списка (то есть они не используют тип указателя, предоставленный распределителем) :
struct _List_node_base
{
_List_node_base* _M_next; ///< Self-explanatory
_List_node_base* _M_prev; ///< Self-explanatory
...
}
(Для этой цели интерфейс распределителя также несовершенен в том смысле, что он не определяет функцию разыменования; для разыменования целочисленного индекса всегда требуется указатель на базовое хранилище.)
Знаете ли вы библиотеку STL-подобных структур данных (я в основном нуждаюсь в одно- и двусвязных списках), которые используют индексы (относительно базового вектора) вместо указателей для связи узлов?
[*] Экономия места: списки будут содержать много 32-битных целых чисел. С двумя указателями на узел (список STL имеет двойную связь), накладные расходы составляют 200% или 400% на 64-разрядной платформе, не считая накладных расходов распределителя по умолчанию.
РЕДАКТИРОВАТЬ: Я ищу реализацию SLL, которая определяет узлы следующим образом:
struct list_node
{
int _value; ///< The value in the list
int _next; ///< Next node in the list
...
}
_next интерпретируется по отношению к. неявный массив или вектор (должен быть предоставлен извне каждому методу, работающему в списке).
EDIT2: После небольшого поиска я обнаружил, что стандарт фактически требует, чтобы распределители, предназначенные для использования со стандартными коллекциями, определяли тип указателя, эквивалентный T *.