C++ 侵入列表

C++ 侵入列表,c++,c,C++,C,我在网上找不到太多关于他们的信息。它们是什么,通常在什么时候使用 谢谢。入侵列表是指指向下一个列表节点的指针存储在与节点数据相同的结构中的列表。这通常是一件坏事,因为它将数据绑定到特定的列表实现。大多数类库(例如C++标准库)使用非侵入性列表,其中数据对列表(或其他容器)实现一无所知。 < P>我实际上喜欢入侵模型。 它在内存方面更好(没有太多小的内存分配用于存储内容) (指向其他事物) 它允许一个对象同时存在于多个容器中 它允许您使用一种搜索模式(散列)查找一个元素,然后按字母顺序查找下一个元

我在网上找不到太多关于他们的信息。它们是什么,通常在什么时候使用


谢谢。

入侵列表是指指向下一个列表节点的指针存储在与节点数据相同的结构中的列表。这通常是一件坏事,因为它将数据绑定到特定的列表实现。大多数类库(例如C++标准库)使用非侵入性列表,其中数据对列表(或其他容器)实现一无所知。

< P>我实际上喜欢入侵模型。

  • 它在内存方面更好(没有太多小的内存分配用于存储内容) (指向其他事物)
  • 它允许一个对象同时存在于多个容器中
  • 它允许您使用一种搜索模式(散列)查找一个元素,然后按字母顺序查找下一个元素
    • 这与#2不同,但可以通过实现,但请注意,
      multi#u index_container
      有一些缺点,这些缺点与入侵容器无关
  • 侵入性是好的


    …您只需要知道自己在做什么(对于任何容器都是如此)。

    侵入列表是对象本身就是列表的头或单元格的列表。它们是好的还是坏的取决于上下文

    在某些已定义的模块内(不可见的一组类一起工作),它可能是连接类之间关系的最佳方法。它们允许对诸如unicity这样的公共关系进行无成本的直接和全面管理(例如:苹果在苹果树中不会出现两次,这不需要任何键,苹果也不属于两棵不同的树),它们可以在两个方向上导航(直接向苹果树发送一个苹果,向苹果树发送一些苹果)。所有基本操作都是O(1)(在某些外部容器中不进行搜索)


    两个模块之间的入侵列表非常糟糕。因为它们将被绑定在一起,模块调整是代码独立性的管理。

    以下是一个对列表也有效的简要描述:

    I.侵入性容器

    要存储的对象包含允许在容器中集成的附加信息。例子: struct Node { Node* next; // additional Node* prev; // information T data; } 结构体类型 { Node*next;//其他 Node*prev;//信息 T数据; } 1.赞成的意见:
    • 存储对象本身。

    • 不涉及内存管理。

    • 迭代速度更快。
    • 更好的例外保证。
    • 插入和删除对象的可预测性。(不需要额外的(不可预测的)内存管理。)
    • 更好的内存位置
    2.欺骗:
    • 包含用于容器集成的其他数据。 (每种商店类型都必须适应(修改)集装箱要求。)
    • 更改存储对象的内容时,请注意可能产生的副作用。(尤其是关联容器。)
    • 插入对象的生存期管理,独立于容器
    • 对象可能在从容器中删除之前被释放,从而导致迭代器失效
    • 入侵容器是不可复制和不可分配的

    二,。非指示性容器(C++标准容器) 对象不“知道”并包含有关要存储在其中的容器的详细信息。例子: struct Node { T data; } 结构体类型 { T数据; } 1.赞成的意见:
    • 不包含有关容器集成的其他信息
    • 由容器管理的对象的生存期。(不太复杂。)
    2.欺骗:
    • 存储用户传递的值的副本。(可就地施工。)
    • 一个对象只能属于一个容器。(或者contaier应该存储指向对象的指针。)
    • 存储副本的开销。(每次分配的簿记)
    • 不可复制或不可移动的对象不能存储在非侵入性容器中
    • 无法存储派生对象并仍保持其原始类型。(切片-松开多态性。)


    令人惊讶的是,如此多的人完全错了(比如Ziezi的答案)。当事情真的很简单的时候,人们似乎把事情复杂化了

    在侵入式链表中,没有显式的“节点”结构/类。相反,“数据”结构/类本身包含链接列表中其他数据的下一个和上一个指针/引用

    例如(侵入式链表节点):

    请注意,next和prev指针是如何并排放置并侵入实体的私有数据字段(如fieldA)的。这“违反”了标准链表(见下文)强制实施的关注点分离,但有助于大大减少查找特定节点的列表遍历量,并降低内存分配

    在侵入式链表中,“链表”本身通常是虚拟的,通常根本不需要创建链表结构/类

    相反,您可以简单地在某个所有者/管理者中存储指向第一个数据项的头指针。 此管理器还包含根据需要更新指针的添加/删除函数。 有关更多信息,请参阅

    拥有一对next/prev指针意味着每个对象只能属于一个列表。但是,您当然可以根据需要添加多对next/prev指针(或定义next/prev指针数组),以支持多个列表中的对象

    在非侵入式(ie标准)链表中,下一个/上一个指针是专用“节点”实体和actu的一部分
    struct Data { 
       Data *next; 
       Data *prev; 
       int fieldA; 
       char * fieldB; 
       float fieldC; 
    }  
    
    struct Data { 
       int fieldA; 
       char * fieldB; 
       float fieldC; 
    }  
    
    struct Node { 
       Node *next; 
       Node *prev; 
       Data *data; 
    }