【发布时间】:2011-06-27 14:40:34
【问题描述】:
我见过 intrusive 一词用来描述列表和堆栈等数据结构,但它是什么意思?
您能否给出一个侵入式数据结构的代码示例,以及它与非侵入式数据结构的区别?
另外,为什么要使其具有侵入性(或非侵入性)?有什么好处?有什么缺点?
【问题讨论】:
标签: c++ c language-agnostic data-structures terminology
我见过 intrusive 一词用来描述列表和堆栈等数据结构,但它是什么意思?
您能否给出一个侵入式数据结构的代码示例,以及它与非侵入式数据结构的区别?
另外,为什么要使其具有侵入性(或非侵入性)?有什么好处?有什么缺点?
【问题讨论】:
标签: c++ c language-agnostic data-structures terminology
在侵入式容器中,数据本身负责为容器存储必要的信息。这意味着一方面数据类型需要根据其存储方式进行专门化,另一方面这意味着数据“知道”它是如何存储的,因此可以更好地优化。
非侵入式:
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;
我个人更喜欢侵入式设计,因为它的透明度。
【讨论】:
一种侵入式数据结构是一种需要它打算存储的元素的帮助才能存储它们的结构。
让我改写一下。当您将某些东西放入该数据结构中时,该“某物”会以某种方式意识到它在该数据结构中的事实。将元素添加到数据结构中会更改元素。
例如,您可以构建一个非侵入式二叉树,其中每个节点都有一个对左右子树的引用,以及对该节点元素值的引用。
或者,您可以构建一个侵入式的,其中对这些子树的引用嵌入到值本身中。
侵入式数据结构的一个例子是可变元素的有序列表。如果元素发生变化,则列表需要重新排序,因此列表对象必须侵入元素的隐私才能获得它们的合作。 IE。元素必须知道它所在的列表,并通知它变化。
ORM 系统通常围绕侵入式数据结构展开,以最大限度地减少对大型对象列表的迭代。例如,如果您检索数据库中所有员工的列表,然后更改其中一个的名称,并希望将其保存回数据库,那么当员工对象发生更改时,就会告知侵入性员工列表,因为对象知道它在哪个列表中。
一个非侵入性的列表不会被告知,并且必须自己弄清楚发生了什么变化以及它是如何变化的。
【讨论】: