Answers:
侵入式数据结构是一种需要从其打算存储的元素来进行存储的帮助。
让我改写一下。当您将某种内容放入该数据结构中时,该“某物”将以某种方式意识到它位于该数据结构中的事实。将元素添加到数据结构会更改元素。
例如,您可以构建一个非侵入式二叉树,其中每个节点都具有对左右子树的引用以及对该节点的元素值的引用。
或者,您可以构建一个侵入式的结构,其中将对这些子树的引用嵌入到值本身中。
侵入式数据结构的一个示例是可变元素的有序列表。如果元素发生更改,则需要对列表进行重新排序,因此列表对象必须侵入元素的隐私中才能获得它们的协作。即。元素必须知道它所在的列表,并通知其更改。
ORM系统通常围绕侵入性数据结构展开,以最大程度地减少大对象列表上的迭代。例如,如果您检索数据库中所有雇员的列表,然后更改其中一个的名称,并想将其保存回数据库,则将在雇员对象更改时告知雇员侵入式列表,因为对象知道它在哪个列表中。
一个非侵入式列表将不会被告知,并且必须弄清楚什么发生了变化以及它如何发生了变化。
在侵入式容器中,数据本身负责存储容器的必要信息。这意味着,一方面需要根据如何存储数据来专门化数据类型,另一方面,这意味着数据“知道”如何存储数据,因此可以稍微优化一下。
非侵入式:
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;
我个人更喜欢侵入性设计,因为它具有透明度。