代码之家  ›  专栏  ›  技术社区  ›  zvrba

STL容器中的索引而不是指针?

  •  1
  • zvrba  · 技术社区  · 14 年前

      struct _List_node_base
      {
        _List_node_base* _M_next;   ///< Self-explanatory
        _List_node_base* _M_prev;   ///< Self-explanatory
        ...
      }
    

    (为此,分配器接口也有缺陷,因为它没有定义解引用函数取消引用“整数索引总是需要指向底层存储的指针。)

    你知道一个使用索引(wrt)的类似STL的数据结构库吗。一个基向量)而不是指向链接节点的指针?

    [*]节省空间:列表将包含

      struct list_node
      {
        int _value;  ///< The value in the list
        int _next;   ///< Next node in the list
        ...
      }
    

    EDIT2:在进一步搜索之后,我发现标准实际上要求用于标准集合的分配器必须定义与T*等价的指针类型。

    5 回复  |  直到 14 年前
        1
  •  3
  •   Crashworks    14 年前

        2
  •  5
  •   Billy ONeal IS4    14 年前

    为什么要使用STL列表?除非你有 非常 具体要求,您应该使用 vector deque 德克 list 矢量

    编辑:关于你对提供 operator[] ,这样的结构不存在(至少,不存在并且仍然符合STL)。STL的关键设计思想之一是算法和容器只提供它们所能提供的 高效 . 考虑提供 运算符[]

        3
  •  1
  •   Vicente Botet Escriba    14 年前

    Boost.Interprocess (containers)提供使用分配器指针类型的slist容器。也许这就是你想要的:)

    即使这些容器包含在Boost.Interprocess中,它们也能在进程内内存中完美地工作。此外,作者已经做了分离,并提出将bots作为Boost.Containers( Documentation Source )

        4
  •  0
  •   Marcelo Cantos    14 年前

    一个有点不太可能的选择是 Judy Arrays . 它们提供高效的存储和计算效率。它们适于存储整数集;我不知道这是否适合你的问题。

        5
  •  0
  •   Community Lee    7 年前

    如果您担心链表存储大量数据的内存开销 int 值,你绝对应该考虑 vector deque as Billy ONeal suggested .

    与链表相比,这些容器的缺点是在插入元素时。你们两个中的任何一个 德克 矢量 如果将项目插入容器中间,则必须复制元素( 德克 如果要在容器的开头插入,它比vector有很大的优势,甚至在添加到容器的结尾时也有优势)。

    但是,复制 内景 德克 可以通过索引在固定时间内定位元素,并且由于数据结构通常被读取的频率远远高于被修改的频率,因此您可能会看到使用这两种方法之一的净增益 德克 矢量 内景 通过索引访问的(甚至是自定义版本)。