【问题标题】:What does it mean for a data structure to be "intrusive"?数据结构“侵入性”意味着什么?
【发布时间】:2011-06-27 14:40:34
【问题描述】:

我见过 intrusive 一词用来描述列表和堆栈等数据结构,但它是什么意思?

您能否给出一个侵入式数据结构的代码示例,以及它与非侵入式数据结构的区别?

另外,为什么要使其具有侵入性(或非侵入性)?有什么好处?有什么缺点?

【问题讨论】:

    标签: c++ c language-agnostic data-structures terminology


    【解决方案1】:

    在侵入式容器中,数据本身负责为容器存储必要的信息。这意味着一方面数据类型需要根据其存储方式进行专门化,另一方面这意味着数据“知道”它是如何存储的,因此可以更好地优化。

    非侵入式:

    template<typename T>
    class LinkedList
    {
      struct ListItem
      {
        T Value;
        ListItem* Prev;
        ListItem* Next;
      };
    
      ListItem* FirstItem;
      ListItem* LastItem;
    
      [...]
      ListItem* append(T&& val)
      {
        LastItem = LastItem.Next = new ListItem{val, LastItem, nullptr};
      };
    };
    
    LinkedList<int> IntList;
    

    侵入性:

    template<typename T>
    class LinkedList
    {
      T* FirstItem;
      T* LastItem;
    
      [...]
      T* append(T&& val)
      {
        T* newValue = new T(val);
        newValue.Next = nullptr;
        newValue.Prev = LastItem;
        LastItem.Next = newValue;
        LastItem = newValue;
      };
    };
    
    struct IntListItem
    {
      int Value;
      IntListItem* Prev;
      IntListItem* Next;
    };
    
    LinkedList<IntListItem> IntList;
    

    我个人更喜欢侵入式设计,因为它的透明度。

    【讨论】:

    • 最后一行很奇怪,因为“透明”这个词的用法,因为在侵入式容器中对对象透明。
    • @ArtB 更清楚地传达了数据在最终应用程序中的确切使用方式,对于非侵入性数据,您通常必须挖掘容器,而对于您从中看到的侵入性数据仅数据的结构。
    • 好吧,我想透明的任何“透明”用法都应该从哪个角度来限定。根据我的经验,“透明”通常用于表示数据的处理方式对域是不可见的(即域建模是纯的)。如果这个术语被双向使用,我想知道它是否有任何价值。
    • @ArtB 哦!透明有一些特殊的计算机科学含义!对我来说,透明意味着您可以看到内部结构,例如“不妨碍视图”,就像在任何非 cs 上下文中使用的术语一样。
    【解决方案2】:

    一种侵入式数据结构是一种需要它打算存储的元素的帮助才能存储它们的结构。

    让我改写一下。当您将某些东西放入该数据结构中时,该“某物”会以某种方式意识到它在该数据结构中的事实。将元素添加到数据结构中会更改元素。

    例如,您可以构建一个非侵入式二叉树,其中每个节点都有一个对左右子树的引用,以及对该节点元素值的引用。

    或者,您可以构建一个侵入式的,其中对这些子树的引用嵌入到值本身中。

    侵入式数据结构的一个例子是可变元素的有序列表。如果元素发生变化,则列表需要重新排序,因此列表对象必须侵入元素的隐私才能获得它们的合作。 IE。元素必须知道它所在的列表,并通知它变化。

    ORM 系统通常围绕侵入式数据结构展开,以最大限度地减少对大型对象列表的迭代。例如,如果您检索数据库中所有员工的列表,然后更改其中一个的名称,并希望将其保存回数据库,那么当员工对象发生更改时,就会告知侵入性员工列表,因为对象知道它在哪个列表中。

    一个非侵入性的列表不会被告知,并且必须自己弄清楚发生了什么变化以及它是如何变化的。

    【讨论】:

    • 我还是想看看一个例子和利弊,但这是一个很好的介绍。
    • 我会说 STL 是非侵入性的,而不是邮政编码,而 Boost.Intrusive 是侵入性的(显然)。
    • 侵入式优点:无需将数据复制到内部结构中,即可按原样使用。缺点:您必须打破对数据的封装以支持将要存储数据的容器。如果您的数据需要位于多个容器中,这可能会变得很棘手。非侵入式容器优点:更好的封装无需修改容器的数据。缺点:需要将数据复制到内部节点结构。
    • boost.org/doc/libs/1_45_0/doc/html/intrusive.html 有例子,并很好地描述了优缺点。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2023-03-10
    • 2015-12-24
    • 2016-08-05
    • 2011-11-08
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多