数据结构“侵入”意味着什么?


120

我见过侵入式一词,用于描述列表和堆栈之类的数据结构,但这意味着什么?

您能否举一个侵入式数据结构的代码示例,它与非侵入式数据结构有何不同?

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

Answers:


107

侵入式数据结构是一种需要从其打算存储的元素来进行存储的帮助。

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

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

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

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

ORM系统通常围绕侵入性数据结构展开,以最大程度地减少大对象列表上的迭代。例如,如果您检索数据库中所有雇员的列表,然后更改其中一个的名称,并想将其保存回数据库,则将在雇员对象更改时告知雇员侵入式列表,因为对象知道它在哪个列表中。

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


8
我仍然想看一个例子和优点和缺点,但这是一个很好的介绍。
Rudiger

我会说STL是非侵入性的,而Boost.Intrusive是侵入性的(显然),而不是邮政编码。
stonemetal

1
侵入性优点:无需将数据复制到可以按原样使用的内部结构中。缺点:必须破坏对数据的封装,以支持将数据存储在其中的容器。如果数据需要位于多个容器中,则可能会变得棘手。非侵入式容器优点:更好的封装,无需修改容器的数据。缺点:需要将数据副本复制到内部节点结构。
stonemetal

3
boost.org/doc/libs/1_45_0/doc/html/intrusive.html提供了示例,并对优缺点进行了很好的描述。
托尼·德罗伊


22

在侵入式容器中,数据本身负责存储容器的必要信息。这意味着,一方面需要根据如何存储数据来专门化数据类型,另一方面,这意味着数据“知道”如何存储数据,因此可以稍微优化一下。

非侵入式:

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;

我个人更喜欢侵入性设计,因为它具有透明度。


由于使用了“透明”一词,因此最后一行令人感到好奇,因为它位于侵入式容器中,对对象不是透明的。
雪橇2014年

@ArtB在传达数据在最终应用程序中的确切使用方式时更为清晰,对于非侵入式数据,通常必须挖掘到容器中,而对于侵入式数据,则仅从数据结构中即可看到。
API-Beast

1
好吧,我认为应该从哪个角度对“透明”的任何用法进行限定。以我的经验,“透明”通常用于表示如何处理数据对于域是不可见的(即域建模是纯的)。如果该术语同时使用,我想知道它是否有任何价值。
雪橇

2
@ArtB哦!有一些特殊的计算机科学含义是透明的!透明对我来说意味着您可以看到内部结构,例如“不妨碍视图”,就像在任何非CS上下文中使用该术语一样。
API-Beast
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.