当前位置: 首页 > article >正文

形象地理解UE4中的数据结构 TLinkedListBase

大家都熟知链表,但不一定能快速看懂UE4中的数据结构。

TLinkedListBase表示“链接”中的一个结点,有三个成员:

一、ElementType   Element;  表示具体的业务,例如int链条中的一个整数。

二、NextLink 表示 “下一个Node”,这是一个指向“下一个Node” 的指针,也非常好理解。

    /** The next link in the linked list */
    ContainerType*  NextLink;


三、PrevLink 表示 “前一个Node” 的 “NextLink”,这是一个指针,它指向的是 “前一个Node” 的 “NextLink” 成员。逻辑上,我的 “前一个Node”的“NextLink”,通常就是 “我本身”(this)。

    /** Pointer to 'NextLink', within the previous link in the linked list 
    * 指向 “前一个节点” 的 NextLink 成员
    */
    ContainerType** PrevLink;

这是一种什么感觉呢?就像是一个人(我 this),拿着别人手里的枪(别人的NextLink),指向我自己(this)。有了这样的一个形象的比喻,就可以理解下面的源代码了。

LinkBefore 在给定的元素之前插入“我”

FORCEINLINE void LinkBefore(ContainerType* Before)
// 首先,我们设想一下结局: this 将会在 Before(简称B) 的前面
// 
// 原本是 (前)T → B → N(后),以及 (前)P → This → Q(后),其中箭头指向的是后一个结点。
// 经过本方法后是:
// (前)T → This → B → N (后)

{
    checkSlow(Before != NULL);

    PrevLink = Before->PrevLink; // 我很强势,我之前手里拿着别人(P)的枪(P的NextLink指针),让这把枪指向了自己(现状如此、无须解释),如今,我换了一个人(T,即B的Previous),拿着他(T)手里的枪,指向了自己This(见下面第10行)。
    

    Before->PrevLink = &NextLink; // 这一句话的意思是: B拿着我的枪,&NextLink 这就是我的枪,指向了B。
    // 也就是形成 This → B


    NextLink = Before; // 我的Next指针指向B,也就是形成 This → B

    if (PrevLink != NULL)
    {
       *PrevLink = (ContainerType*)this; //【10行】 // 也就是形成 T → This
    }

// 到这里,B → N的关系没有变动。并形成了 T → This → B → N。
}

再重新复习一下: PrevLink 的意思是 上一个节点的NextLink指针,只要把“X的 PrevLink ”指向某个Node Y,那么Y就是X的上一个节点了。

X->PrevLink = &Y; // 意味着Y成为X的上一个节点

LinkHead 将This插入到Head的前面

/**
 * Adds this element as the head of the linked list, linking the input Head pointer to this element,
 * so that when the element is linked/unlinked, the Head linked list pointer will be correctly updated.
 *
 * If Head already has an element, this functions like LinkBefore.
 *
 * @param Head     Pointer to the head of the linked list - this pointer should be the main reference point for the linked list
 */


// 原本是 P → This → Q,以及 T → Head → N
// 经过本方法后是:
//      P
//      ↓
// T → This → Head → N

FORCEINLINE void LinkHead(ContainerType*& Head)
{
    if (Head != NULL)
    {
       Head->PrevLink = &NextLink; // 形成 This → Head
    }

    NextLink = Head; // 形成 This → Head ,意味着断开了对Q的连接
    PrevLink = &Head; 

// 还记得Head的类型是 ContainerType* 的 & 吗?由于Head本身就是一个指针,且是该指针的本体,而非该指针的副本,所以这个指针对象本身,其实是T的成员“NextLink”。
// 所以这一句可以理解为 
// This.PrevLink = &(Head) = &(T->NextLink)
// 所以含义是形成了 T → This 

// 可以说C++语言博大精深,Head 是指Head节点,而 &Head 是Head 节点的前一个节点T 的NextLink成员

    Head = (ContainerType*)this; 
    // 对外界来说,我This,成为了新的Head
    // 也就是 Head 等价于 T->NextLink 赋值为 This ,即形成了 T → Head

}


http://www.kler.cn/a/460497.html

相关文章:

  • 网工日记:FTP两种工作模式的区别
  • 丢弃法hhhh
  • 2501d,d的匿名构
  • AWS S3文件存储工具类
  • 【人工智能机器学习基础篇】——深入详解深度学习之复杂网络结构:卷积神经网络(CNN)、循环神经网络(RNN)、生成对抗网络(GAN)等概念及原理
  • 常见硬件及其对应的驱动模块列表
  • [极客大挑战 2019]LoveSQL 1解题思路
  • Java多线程中,synchronized和ReentrantLock的区别是什么?及使用场景有哪些?
  • html+css网页设计 美食 美食美客模版2个页面
  • python 选择排序(Selection Sort)
  • 纯前端实现将pdf转为图片(插件pdfjs)
  • 优化大肠杆菌菌株和发酵工艺以提高L-赖氨酸生产-文献精读94
  • 如何修复 WordPress 中的“Error establishing a database connection”问题
  • DeepSeek-V3-Base 模型技术解析
  • 智能工厂的设计软件 应用场景的一个例子:为AI聊天工具添加一个知识系统 之10 方案再探:特定于领域的模板 之1 随想交流
  • 口语笔记——感官+花费
  • MySQL数据库的锁
  • ubuntu 使用samba与windows共享文件[注意权限配置]
  • 留学生该如何进行文学分析类的essay写作
  • 分析电控发动机常见故障原因
  • vue使用el-select下拉框自定义复选框
  • IDEA修改编译版本
  • [2025] 如何在 Windows 计算机上轻松越狱 IOS 设备
  • 什么是 GPT?Transformer 工作原理的动画展示
  • TP 钱包插件版本的使用
  • 假设与思想实验:我们能否编写具有感知基础的人工智能形式来保护人类?