【发布时间】:2010-04-23 06:43:26
【问题描述】:
由于特定要求 [*],我需要一个使用整数索引而不是指向链接节点的指针的单链表实现。索引总是相对于包含列表节点的向量进行解释。
我想我可以通过定义我自己的分配器来实现这一点,但是查看 gcc 的实现,他们明确地使用了列表节点中链接字段的指针(即,他们不使用分配器提供的指针类型) :
struct _List_node_base
{
_List_node_base* _M_next; ///< Self-explanatory
_List_node_base* _M_prev; ///< Self-explanatory
...
}
(为此,分配器接口的不足之处还在于它没有定义解引用函数;“解引用”整数索引总是需要指向底层存储的指针。)
你知道一个类似 STL 的数据结构库(我主要需要单链表和双链表),它使用索引(一个基向量)而不是指向链接节点的指针吗?
[*] 节省空间:列表将包含 许多 32 位整数。每个节点有两个指针(STL 列表是双向链接的),开销为 200%,或在 64 位平台上为 400%,不计算默认分配器的开销。
编辑:我正在寻找一个以下列方式定义节点的 SLL 实现:
struct list_node
{
int _value; ///< The value in the list
int _next; ///< Next node in the list
...
}
_next 被解释为 wrt。隐式数组或向量(必须在外部提供给对列表进行操作的每个方法)。
EDIT2:经过一番搜索,我发现该标准实际上要求旨在与标准集合一起使用的分配器必须将指针类型定义为与 T* 等效。
【问题讨论】:
-
请注意,对于许多 32 位整数 (=100000?),您的索引可能还需要为 32 位。
-
是的,索引将是 32 位。它仍然是 64 位拱形指针大小的一半。
-
为什么需要使用这个奇特的列表而不是直接使用向量或双端队列?这将完全减少每个元素的开销。
-
@Mark B:与想要使用链表的原因相同:在列表中的任何位置进行恒定时间插入和删除。