不能将参数 1 从“int &(__thiscall RBTree<T>::* )(RBTreeNode<T> *)”转换为“int &(__cdecl *)(RBTreeNode<T> *)”

本文深入解析了C++成员函数的调用约定,包括thiscall和__cdecl两种方式的区别及用法。通过具体代码示例,详细解释了每个约定的工作原理和参数传递方式。

因为你需要的是一个类的函数地址而不是对象的。所以必需用静态成员函数。

static  int    implement(int x); //改成静态成员函数

或者友元也可以吧???


thiscall仅仅应用于“C++”成员函数。this指针存放于CX/ECX寄存器中,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。 

__cdecl 
C调用约定(即用__cdecl关键字说明)(The C default calling convention)按从右至左的顺序压参数入栈,由调用者把参数弹出栈。对于传送参数的内存栈是由调用者来维护的(正因为如此,实现可变参数vararg的函数(如printf)只能使用该调用约定)。另外,在函数名修饰约定方面也有所不同。 _cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。VC将函数编译后会在函数名前面加上下划线前缀。

声明的话直接像下面这样就行了
C/C++ code
?
1
   int  __cdecl    implement( int  x); 
//#ifdef __RBTREE_H__ #ifndef __RBTREE_INL_H__ #define __RBTREE_INL_H__ #include &quot;RBTree.h&quot; #ifdef _RBTREE_DEBUG #include &quot;../../DebugInfo/Include/DebugInfo.h&quot; #endif // _RBTREE_DEBUG template&lt;class KEY, class VALUE&gt; RBTREE::RBTree&lt;KEY, VALUE&gt;::RBTree() :m_pRoot(nullptr), m_pHead(nullptr),m_pTail(nullptr) { #ifdef _RBTREE_DEBUG Info(&quot;构造红黑树:{}&quot;, fmt::ptr(this)); #endif } template&lt;class KEY, class VALUE&gt; RBTREE::RBTree&lt;KEY, VALUE&gt;::~RBTree() { #ifdef _RBTREE_DEBUG Info(&quot;析构红黑树:{}&quot;, fmt::ptr(this)); #endif //Destroy(); ListDestroy(); } template&lt;class KEY, class VALUE&gt; RBTREE::RBTree&lt;KEY, VALUE&gt;::RBTree(RBTree&amp;&amp; _Instance) : m_pRoot(_Instance.m_pRoot), m_pHead(_Instance.m_pHead), m_pTail(_Instance.m_pTail) { #ifdef _RBTREE_DEBUG Info(&quot;移动构造红黑树:{}&quot;, fmt::ptr(this)); #endif _Instance.m_pRoot = nullptr; _Instance.m_pHead = nullptr; _Instance.m_pTail = nullptr; } /************************************************************************************************************************************************/ //向红黑树插入元素 template&lt;class KEY, class VALUE&gt; VALUE* RBTREE::RBTree&lt;KEY, VALUE&gt;::Insert(KEY&amp;&amp; _Instance, VALUE&amp;&amp; _Value) { #ifdef _RBTREE_DEBUG Info(&quot;------------------------------------------------------------------------------------------------------------&quot;); #endif RBTreeNode&lt;KEY,VALUE&gt;* pNewNode = new RBTreeNode&lt;KEY,VALUE&gt;(std::forward&lt;KEY&gt;(_Instance), std::forward&lt;VALUE&gt;(_Value)); if (!insert(m_pRoot, pNewNode)) { #ifdef _RBTREE_DEBUG Warn(&quot;红黑树&lt;{}&gt;插入元素 {:d} 失败&quot;, fmt::ptr(this), _Instance); #endif delete pNewNode; return nullptr; } else { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素 {:d} 完成&quot;, fmt::ptr(this), _Instance); #endif //list链表插入节点 if (!m_pHead) { m_pHead = pNewNode; m_pTail = pNewNode; } else { m_pTail-&gt;m_pNext = pNewNode; pNewNode-&gt;m_pFront = m_pTail; m_pTail = pNewNode; } } return &amp;pNewNode-&gt;m_Value; } /* 将一个节点插入到红黑树中,需要执行: 第一步: 将红黑树当作一颗二叉查找树,将节点插入。 红黑树本身就是一颗二叉查找树,将节点插入后,该树仍然是一颗二叉查找树。也就意味着,树的键值仍然是有序的。 此外,无论是左旋还是右旋,若旋转之前这棵树是二叉查找树,旋转之后它一定还是二叉查找树。 这也就意味着,任何的旋转和重新着色操作,都不会改变它仍然是一颗二叉查找树的事实。 好吧?那接下来,我们就来想方设法的旋转以及重新着色,使这颗树重新成为红黑树! 第二步:将插入的节点着色为&quot;红色&quot;。 为什么着色成红色,而不是黑色呢?为什么呢?在回答之前,我们需要重新温习一下红黑树的特性: (1) 每个节点或者是黑色,或者是红色。 (2) 根节点是黑色。 (3) 每个叶子节点是黑色。 [注意:这里叶子节点,是指为空的叶子节点!] (4) 如果一个节点是红色的,则它的子节点必须是黑色的。 (5) 从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。 将插入的节点着色为红色,不会违背&quot;特性(5)&quot;!少违背一条特性,就意味着我们需要处理的情况越少。 接下来,就要努力的让这棵树满足其它性质即可;满足了的话,它就又是一颗红黑树了。o(&cap;&cap;)o...哈哈 */ template&lt;class KEY, class VALUE&gt; bool RBTREE::RBTree&lt;KEY, VALUE&gt;::insert(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { // 1. 将红黑树当作一颗二叉查找树,将节点添加到二叉查找树中。 RBTreeNode&lt;KEY,VALUE&gt;* pCursor = _pRoot;//操作游标,一般指当前节点 RBTreeNode&lt;KEY,VALUE&gt;* pPreNode = nullptr;//用作 备份上一个节点.当游标指向空节点时,此指针就能直接向上回溯出父节点 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;准备插入元素{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif while (pCursor != nullptr) { pPreNode = pCursor;//备份上一个节点,游标将指向下个节点 if (_pTargetNode-&gt;m_Key &lt; pCursor-&gt;m_Key) {//目标节点 小于 当前的游标节点 pCursor = pCursor-&gt;m_pLeft;//把左孩子赋值给游标 continue; } else if (_pTargetNode-&gt;m_Key &gt; pCursor-&gt;m_Key) {//目标节点 大于 当前游标节点 pCursor = pCursor-&gt;m_pRight;//把右孩子赋值给游标 continue; } else { //游标节点 等于 目标节点 //退出循环,因为插入操作 找到了相同节点,直接返回false #ifdef _RBTREE_DEBUG Warn(&quot;红黑树&lt;{}&gt;插入元素{:d}时候找到相同的值,插入失败&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif return false; } } //代码执行到此,说明游标节点已经指向到叶子节点(空节点) pCursor = pPreNode;//游标操作节点为空,把备份节点恢复回到游标操作节点. 纯属增强可读性 //代码执行到此,说明游标节点不为空,并且是最后一个有效的尾节点(非空节点) //代码执行到此,说明游标节点的 左右孩子 其中一个肯定是叶子节点(空节点) //开始建立 目标节点与当前游标点 之间的链接 //新插入的节点父节点就是当前游标节点 _pTargetNode-&gt;m_pParent = pCursor;//定义目标节点的父节点 //准备定义游标操作节点的 左右孩子 if (pCursor != nullptr) { if (_pTargetNode-&gt;m_Key &lt; pCursor-&gt;m_Key) {//目标节点 小于 当前游标操作节点 //执行到此,说明游标操作节点的 左孩子 肯定是空节点了 //开始对红黑树插入新节点, 插入当前游标操作节点左边 pCursor-&gt;m_pLeft = _pTargetNode;//游标节点的左孩子 = 目标节点 _pTargetNode-&gt;m_Fork = Fork::LEFT;//插入的新节点属于左孩子 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}完成, 是父节点&lt;{:d}&gt;的左孩子&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pCursor-&gt;m_Key); #endif } else if (_pTargetNode-&gt;m_Key &gt; pCursor-&gt;m_Key) {//目标节点 大于 当前游标操作节点 //执行到此,说明游标操作节点的 右孩子 肯定是空节点了 //开始对红黑树插入新节点, 插入当前游标操作节点右边 pCursor-&gt;m_pRight = _pTargetNode;//游标节点的右孩子 = 目标节点 _pTargetNode-&gt;m_Fork = Fork::RIGHT;//插入的新节点属于右孩子 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}完成, 是父节点&lt;{:d}&gt;的右孩子&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pCursor-&gt;m_Key); #endif } else { #ifdef _RBTREE_DEBUG assert(false);//上面已经返回false,不可能执行到此 #endif //插入的目标节点 与 游标节点 相等。需要特殊处理 return false; } } else { //如果连备份节点都没有备份过,为空。即root节点肯定是空 //直接定义root节点为插入的目标节点 _pRoot = _pTargetNode;//此时的&amp;_pRoot指针地址引用就发挥作用了 _pRoot-&gt;m_Color = Color::BLACK;//根节点必须是黑色 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}完成, 元素是根节点&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif return true; } //设置插入目标节点的颜色为: 红色. 插入新节点为红色对红黑树的性质5影响最小 // _pTargetNode-&gt;m_Color = Color::RED;//节点初始化已经是红色,无须重复设置 //以上插入节点的代码过程和就是二叉树的插入过程,一模一样的。 //不一样的是以下insert_fix函数重新把二叉树修正成一棵平衡二叉树,通过节点的颜色修正。 //插入新节点后, 重新修正为一颗平衡二叉树 insert_fix(_pRoot, _pTargetNode); //修正完成后就是一棵标准的: 红黑树 return true; } /* * 红黑树插入修正函数 * * 在向红黑树中插入节点之后(失去平衡),再调用该函数; * 目的是将它重新塑造成一颗红黑树。 * * 参数说明: * _pRoot 红黑树的根节点 * _pTargetNode 插入的目标节点 */ /* 修正原理 回忆下红黑树的性质: 性质: 1.每个节点要么是红色, 要么就是黑色。 2.根节点必为黑色。 3.叶子节点(NIL)都为黑色,且为null。 4.红色节点的两个子节点都为黑色(红黑树不会出现相邻的红色节点)(即父与子节点不可能都是红色) 5.从任意节点出发,到其每个叶子节点(NIL)的路径中包含相同数量的黑色节点 衍生特性: 1.新加入到红黑树的节点为红色节点,如果新加入节点是黑色,会影响性质4。所以新节点是红色影响最小 2.根据性质3判断: 叶子节点(NIL)虽然是null, 但也算是一个有效的颜色节点 3.根据性质4判断: 黑色节点的2个子节点可以为2个红色节点。也可以是2个黑色节点,但必须是叶子节点(NIL)(左右树不可能存在有效的黑色节点) 4.根据性质4判断: 黑色节点的2个子点也可以是1个红色节点,一个黑色节点(叶子节点NIL)(左右树不可能存在有效的黑色节点) 5.根据性质5判断: 确保没有一条路径会比其他路径长出俩倍 ************************************************************************** 总结插入新节点可能出现的情景,并给出处理方案: 情景1: 插入的节点的父节点是黑色 情景1处理方案:无需任何处理 情景2:插入的节点的父节点是红色(父子节点均为红色,需修正) 根据叔叔节点去拆分3种分支情景: 情景2.1: 叔叔节点是存在,并且是红色 情景2.1处理方案: 将父节点设置成黑色; 将叔叔节点设置成黑色; 将祖父节点设置成红色; 将祖父节点设置成当前节点,继续while循环向上修正 情景2.2: 叔叔节点不存在或者叔叔节点是黑色, 并且插入的节点的父节点是属于其祖父节点的左孩子(叔叔是右孩子) 根据情景2.2去拆分2种分支情景: 情景2.2.1: 插入节点是其父节点的右孩子(内侧插入) 情景2.2.1处理方案: 将当前节点的父节点左旋操作后得到情景2.2.2 处理情景2.2.2 情景2.2.2: 插入节点是其父节点的左孩子(外侧插入) 情景2.2.2处理方案: 将父亲节点设置为黑色 将祖父节点设置成红色 将祖父节点进行右旋操作 情景2.3: 叔叔节点不存在或者叔叔节点是黑色, 并且插入节点的父节点是属于其祖父节点的右孩子(叔叔是左孩子) 根据情景2.3去拆分2种分支情景: 情景2.3.1: 插入的节点是其父节点的左孩子(外侧插入) 情景2.3.1处理方案: 将当前节点的父节点右旋操作后得到情景2.3.2 处理情景2.3.2 情景2.3.2: 插入的节点是其父节点的右孩子(内侧插入) 情景2.3.2处理方案: 将父新节点设置成黑色 将祖父节点设置成红色 将祖父节点进行左旋操作 */ template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::insert_fix(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) {//隐藏条件: 新插入的节点的左右2个叶子(NIL),肯定为空,并且是黑色节点 RBTreeNode&lt;KEY,VALUE&gt;* pCursor = _pTargetNode;//当前的操作游标节点 RBTreeNode&lt;KEY,VALUE&gt;* pGParent = nullptr;//用作储存祖父节点 RBTreeNode&lt;KEY,VALUE&gt;* pParent = nullptr;//用作储存父类节点 RBTreeNode&lt;KEY,VALUE&gt;* pUncle = nullptr;//用作储存叔叔节点 RBTreeNode&lt;KEY,VALUE&gt;* pTmp = nullptr;//临时备份节点,用作2点交换 /********************************************************************/ //情景1: 插入的节点的父节点是黑色 //情景1处理方案 : 无需任何处理 /********************************************************************/ //情景2: 插入节点的父节点是红色 while ((pParent = pCursor-&gt;m_pParent) &amp;&amp; pParent-&gt;m_Color == Color::RED) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}完成, 需要修正平衡(原因是父节点&lt;{:d}&gt;是红色)&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pParent-&gt;m_Key); #endif pGParent = pParent-&gt;m_pParent;//隐藏条件,插入节点的父节点是红色,那么祖父节点必然存在,并且是黑色 //通过父节点找出叔叔节点 pUncle = pParent-&gt;m_Fork == Fork::LEFT ? pGParent-&gt;m_pRight : pParent-&gt;m_Fork == Fork::RIGHT ? pGParent-&gt;m_pLeft : nullptr; //通过叔叔节点再分拆开3个情景: //情景2.1: 叔叔节点存在,并且为红色 //情景2.2: 叔叔节点不存在或是黑色节点并且父节点是祖父节点的左孩子(叔叔是右孩子) //情景2.3: 叔叔节点不存在或是黑色节点并且父节点是祖父节点的右孩子(叔叔是左孩子) if (pUncle &amp;&amp; pUncle-&gt;m_Color == Color::RED)//情景2.1: 叔叔节点存在,并且为红色 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡,父节点&lt;{:d}&gt;是红色, 叔叔节点&lt;{:d}&gt;存在也是红色,触发情景2.1(颜色持衡)&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pParent-&gt;m_Key, pUncle-&gt;m_Key); #endif //情景2.1处理方案: //将父节点设置成黑色; //将叔叔节点设置成黑色; //将祖父节点设置成红色; //将祖父节点设置成当前节点, 继续while循环向上修正 pParent-&gt;m_Color = Color::BLACK; pUncle-&gt;m_Color = Color::BLACK; pGParent-&gt;m_Color = Color::RED; pCursor = pGParent; continue; } else { if (pParent-&gt;m_Fork == Fork::LEFT) //情景2.2: 叔叔节点不存在或者叔叔节点是黑色, 并且插入的节点的父节点是属于其祖父节点的左孩子(叔叔是右孩子) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡,父节点&lt;{:d}&gt;是红色, 叔叔节点不存在或是黑色并是右孩子,触发情景2.2&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pParent-&gt;m_Key); #endif //根据情景2.2去拆分2种分支情景: //情景2.2.1 : 插入节点是其父节点的右孩子(内侧插入) //情景2.2.1处理方案 : //将当前节点的父节点左旋操作后得到情景2.2.2 //处理情景2.2.2 //情景2.2.1: 插入节点是其父节点的右孩子 if (pCursor-&gt;m_Fork == Fork::RIGHT) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发情景2.2.1,准备左旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif left_rotate(_pRoot, pParent);//父节点左旋操作, 左旋完成后,已经得到情景2.2.2 //把当前节点和父节点的操作指针交换,为下面情景2.2.2的处理方案设置颜色作准备 //2点交换开始 pTmp = pCursor; pCursor = pParent; pParent = pTmp; //已经得到情景2.2.2,往下代码开始处理2.2.2 } //情景2.2.2 : 插入节点是其父节点的左孩子(外侧插入) //情景2.2.2处理方案 : //将父亲节点设置为黑色 //将祖父节点设置成红色 //将 祖父节点 进行右旋操作 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发情景2.2.2,准备右旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif pParent-&gt;m_Color = Color::BLACK; pGParent-&gt;m_Color = Color::RED; right_rotate(_pRoot, pGParent); } else if (pParent-&gt;m_Fork == Fork::RIGHT) //情景2.3: 叔叔节点不存在或者叔叔节点是黑色, 并且插入节点的父节点是属于其祖父节点的右孩子(叔叔是左孩子) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡,父节点&lt;{:d}&gt;是红色, 叔叔节点不存在或是黑色并是左孩子,触发情景2.3&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pParent-&gt;m_Key); #endif //根据情景2.3去拆分2种分支情景 : //情景2.3.1 : 插入的节点是其父节点的左孩子(外侧插入) //情景2.3.1处理方案 : //将当前节点的父节点右旋操作后得到情景2.3.2 //处理情景2.3.2 //情景2.3.1: 插入的节点是其父节点的左孩子 if (pCursor-&gt;m_Fork == Fork::LEFT) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发情景2.3.1,准备右旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif right_rotate(_pRoot, pParent);//父节点右旋操作, 右旋完成后已经得到情景2.3.2 //把当前节点和父节点的操作指针交换,为下面情景2.3.2的处理方案设置颜色作准备 //2点交换开始 pTmp = pCursor; pCursor = pParent; pParent = pTmp; //已经得到情景2.3.2,往下代码开始处理情景2.3.2 } //情景2.3.2 : 插入的节点是其父节点的右孩子(内侧插入) //情景2.3.2处理方案 : //将父亲节点设置成黑色 //将祖父节点设置成红色 //将 祖父节点 进行左旋操作 #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发情景2.3.2,准备左旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif pParent-&gt;m_Color = Color::BLACK; pGParent-&gt;m_Color = Color::RED; left_rotate(_pRoot, pGParent); } } } /********************************************************************/ _pRoot-&gt;m_Color = Color::BLACK;//无条件将根节点设置成黑色 } /************************************************************************************************************************************************/ /* * 对红黑树的节点(x)进行左旋转 * * 左旋示意图(对节点x进行左旋): * px px * / / * x y * / \ --(x左旋)--&gt; / \ * lx y x ry * / \ / \ * ly ry lx ly * * */ template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::left_rotate(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发左旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif RBTreeNode&lt;KEY,VALUE&gt;* pParent = _pTargetNode-&gt;m_pParent;//取出目标节点的父节点 Fork fFork = _pTargetNode-&gt;m_Fork;//备份左旋目标的方位 RBTreeNode&lt;KEY,VALUE&gt;* pRotateResult = _left_rotate(_pTargetNode); if (pRotateResult == _pTargetNode) { //左旋失败,原因左旋目标的右孩子为空 return; } switch (fFork) { case Fork::LEFT://如果左旋目标是其父节点的左孩子,进行px与y的链接 pParent-&gt;m_pLeft = pRotateResult;//设置父节点的左孩子为左旋结果y pRotateResult-&gt;m_pParent = pParent;//设置左旋结果的父节点为 左旋目标的父节点px pRotateResult-&gt;m_Fork = Fork::LEFT;//设置左旋结果的方位为: 左 break; case Fork::RIGHT://如果左旋目标是其父节点的右孩子,进行px与y的链接 pParent-&gt;m_pRight = pRotateResult;//设置父节点的右孩子为左旋结果y pRotateResult-&gt;m_pParent = pParent;//设置左旋结果y的父节点为 左旋目标的父节点px pRotateResult-&gt;m_Fork = Fork::RIGHT;//设置左旋结果的方位为: 右 break; case Fork::ROOT://如果左旋目标本身就是根节点root,把左旋结果设置成根节点即可 pRotateResult-&gt;m_pParent = nullptr;//把左旋结果y的父节点设置为空 pRotateResult-&gt;m_Fork = Fork::ROOT;//设置左旋结果的方位为root _pRoot = pRotateResult;//重新设置根节点为左旋结果y break; } } /* * 对红黑树的节点(x)进行右旋转 * * 右旋示意图(对节点x进行右旋): * px px * / / * x y * / \ --(x右旋)--&gt; / \ * y rx ly x * / \ / \ * ly ry ry rx * */ template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::right_rotate(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;插入元素{:d}修正平衡触发右旋&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif RBTreeNode&lt;KEY,VALUE&gt;* pParent = _pTargetNode-&gt;m_pParent;//取出右旋目标节点的父节点px Fork fFork = _pTargetNode-&gt;m_Fork;//备份右旋目标的方位 RBTreeNode&lt;KEY,VALUE&gt;* pRotateResult = _right_rotate(_pTargetNode);//对x进行右旋并返右旋回结 if (pRotateResult == _pTargetNode) { //右旋失败,原因右旋目标的左孩子为空 return; } switch (fFork) { case Fork::LEFT://如果右旋目标是其父节点的左孩子,进行px与y的链接 pParent-&gt;m_pLeft = pRotateResult;//设置父节点的左孩子为右旋结果y pRotateResult-&gt;m_pParent = pParent;//设置右旋结果的父节点为 右旋目标的父节点px pRotateResult-&gt;m_Fork = Fork::LEFT;//设置右旋结果的方位为: 左 break; case Fork::RIGHT://如果右旋目标是其父节点的右孩子,进行px与y的链接 pParent-&gt;m_pRight = pRotateResult;//设置父节点的右孩子为右旋结果y pRotateResult-&gt;m_pParent = pParent;//设置右旋结果y的父节点为 右旋目标的父节点px pRotateResult-&gt;m_Fork = Fork::RIGHT;//设置右旋结果的方位为: 右 break; case Fork::ROOT://如果右旋目标本身就是根节点root,把右旋结果设置成根节点即可 pRotateResult-&gt;m_pParent = nullptr;//把右旋结果y的父节点设置为空 pRotateResult-&gt;m_Fork = Fork::ROOT;//设置右旋结果的方位为root _pRoot = pRotateResult;//重新设置根节点为右旋结果y break; } } /* * 对红黑树的节点(x)进行左旋转 * * 左旋示意图(对节点x进行左旋): * * x y * / \ --(x左旋)--&gt; / \ * lx y x ry * / \ / \ * ly ry lx ly * * */ template&lt;class KEY, class VALUE&gt; RBTREE::RBTreeNode&lt;KEY,VALUE&gt;* RBTREE::RBTree&lt;KEY, VALUE&gt;::_left_rotate(RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { RBTreeNode&lt;KEY,VALUE&gt;* pRight = _pTargetNode-&gt;m_pRight;//获取右孩子y RBTreeNode&lt;KEY,VALUE&gt;* pRLeft = nullptr;//用作存储右孩子的左孩子ly if (!pRight) return _pTargetNode;//如果右孩子为空,还谈什么左旋。根本左旋不了,直接返回左旋目标 pRLeft = pRight-&gt;m_pLeft;//获取右孩子的左孩子ly //准备x与ly进行链接 _pTargetNode-&gt;m_pRight = pRLeft;//设置x的右孩子为ly if (pRLeft)//如果ly不为空 { pRLeft-&gt;m_pParent = _pTargetNode;//设置ly的父节点 pRLeft-&gt;m_Fork = Fork::RIGHT;//设置ly的方位 } //x与ly链接完成 //准备y与x进行链接 pRight-&gt;m_pLeft = _pTargetNode;//设置y的左孩子为x _pTargetNode-&gt;m_pParent = pRight;//设置x的父节点为y _pTargetNode-&gt;m_Fork = Fork::LEFT;//设置x的方位 return pRight;//左旋完成, 返回y } /* * 对红黑树的节点(x)进行右旋转 * * 右旋示意图(对节点x进行右旋): * * x y * / \ --(右旋)--&gt; / \ * y rx ly x * / \ / \ * ly ry ry rx * */ template&lt;class KEY, class VALUE&gt; RBTREE::RBTreeNode&lt;KEY,VALUE&gt;* RBTREE::RBTree&lt;KEY, VALUE&gt;::_right_rotate(RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { RBTreeNode&lt;KEY,VALUE&gt;* pLeft = _pTargetNode-&gt;m_pLeft;//获取左孩子y RBTreeNode&lt;KEY,VALUE&gt;* pLRight = nullptr;//用作存储左孩子y的右孩子ry if (!pLeft)return _pTargetNode;//如果左孩子y为空,还谈什么右旋。根本右旋不了,直接返回右旋目标 pLRight = pLeft-&gt;m_pRight;//获取左孩子y的右孩子ry //准备x与ry进行链接 _pTargetNode-&gt;m_pLeft = pLRight;//把x的左孩子设置成ry if (pLRight) { pLRight-&gt;m_pParent = _pTargetNode;//设置ry的父节点为x pLRight-&gt;m_Fork = Fork::LEFT;//设置ry的方位 } //x与ry链接完成 //准备y与x进行链接 pLeft-&gt;m_pRight = _pTargetNode;//设置y的右孩子为x _pTargetNode-&gt;m_pParent = pLeft;//设置x的父节点为y _pTargetNode-&gt;m_Fork = Fork::RIGHT;//设置x的方位 //y与x的链接完成 return pLeft;//右旋完成, 返回y } /************************************************************************************************************************************************/ #ifdef _RBTREE_DEBUG #ifdef _DEBUG #ifdef _WIN32 //供打印树使用 #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;Windows.h&gt; //以树状向控制台打印出红黑树 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::PrintTree() { traverse_print(m_pRoot); } /* * 递归打印打印出树形 * KEY 正在打印的树 * depth 目前在打印树的第几层 * right 该子树是否为右子树 * tap 目前子树需要的相对偏移数量 */ template&lt;class KEY, class VALUE&gt; int RBTREE::RBTree&lt;KEY, VALUE&gt;::traverse_print(RBTreeNode&lt;KEY,VALUE&gt;* _pRoot, int _iDepth, int _iRight, int _iTap) { if (_pRoot == nullptr)return 1; static int iTreeDepth = tree_depth(_pRoot); int x, y; RBTreeNode&lt;KEY,VALUE&gt;* pLeft = nullptr; RBTreeNode&lt;KEY,VALUE&gt;* pRight = nullptr; unfold_tree(_pRoot, pLeft, pRight); int tap1 = _iTap * (int)pow(2, iTreeDepth - _iDepth); int tap2 = _iRight * (int)pow(2, iTreeDepth - _iDepth); int tap3 = (int)pow(2, iTreeDepth - _iDepth - 1); x = tap1 + tap2 + tap3 - 1; y = _iDepth * 2; gotoxy(x * 2, y); printf(&quot;%d%c&quot;, _pRoot-&gt;m_Key, _pRoot-&gt;m_Color == Color::RED ? &#39;r&#39; : _pRoot-&gt;m_Color == Color::BLACK ? &#39;b&#39; : &#39;N&#39;); _iDepth++; _iTap = _iTap * 2 + (_iRight == 1 ? 2 : 0); if (pLeft == nullptr &amp;&amp; pRight == nullptr) { return 1; } else if (pRight == nullptr) { gotoxy(x * 2 - tap3, y + 1); printf(&quot;┏&quot;); for (int i = 0; i &lt; tap3 - 1; i++) printf(&quot;━&quot;); printf(&quot;┛&quot;); traverse_print(pLeft, _iDepth, 0, _iTap); } else if (pLeft == NULL) { // 打印右子树的位置 gotoxy(x * 2, y + 1); printf(&quot;┗&quot;); for (int i = 0; i &lt; tap3 - 1; i++) printf(&quot;━&quot;); printf(&quot;┓&quot;); traverse_print(pRight, _iDepth, 1, _iTap); } else { // 打印左右子树的位置 gotoxy(x * 2 - tap3, y + 1); printf(&quot;┏&quot;); for (int i = 0; i &lt; tap3 - 1; i++) printf(&quot;━&quot;); printf(&quot;┻&quot;); for (int i = 0; i &lt; tap3 - 1; i++) printf(&quot;━&quot;); printf(&quot;┓&quot;); traverse_print(pLeft, _iDepth, 0, _iTap); traverse_print(pRight, _iDepth, 1, _iTap); } return 1; } // 获取树的深度 template&lt;class KEY, class VALUE&gt; int RBTREE::RBTree&lt;KEY, VALUE&gt;::tree_depth(RBTreeNode&lt;KEY,VALUE&gt;* _pRoot) { if (_pRoot == nullptr) return 0; int depthLeft, depthRight; depthLeft = tree_depth(_pRoot-&gt;m_pLeft); depthRight = tree_depth(_pRoot-&gt;m_pRight); return 1 + (depthLeft &gt; depthRight ? depthLeft : depthRight); } // 将二叉树分为根,左子树,右子树三个部分 template&lt;class KEY, class VALUE&gt; int RBTREE::RBTree&lt;KEY, VALUE&gt;::unfold_tree(RBTreeNode&lt;KEY,VALUE&gt;* _pRoot, RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pLeft, RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRight) { if (_pRoot == NULL) return 0; _pLeft = _pRoot-&gt;m_pLeft; _pRight = _pRoot-&gt;m_pRight; return 1; } //改变光标位置 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::gotoxy(int x, int y) { // 更新光标位置 COORD pos; HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE); pos.X = x; pos.Y = y; SetConsoleCursorPosition(hOutput, pos); } #endif // _WIN32 #endif //_DEBUG #endif template&lt;class KEY, class VALUE&gt; RBTREE::RBTreeNode&lt;KEY,VALUE&gt;* RBTREE::RBTree&lt;KEY, VALUE&gt;::search(RBTreeNode&lt;KEY,VALUE&gt;* _pRoot, const KEY&amp; _Instance) { if (!_pRoot)return nullptr; if (_Instance == _pRoot-&gt;m_Key)return _pRoot; else if (_Instance &lt; _pRoot-&gt;m_Key)return search(_pRoot-&gt;m_pLeft, _Instance); else return search(_pRoot-&gt;m_pRight, _Instance); } template&lt;class KEY, class VALUE&gt; bool RBTREE::RBTree&lt;KEY, VALUE&gt;::Remove(const KEY&amp; _Instance) { RBTreeNode&lt;KEY,VALUE&gt;* pTarget = search(m_pRoot, _Instance); if (pTarget) { list_remove(pTarget); remove(m_pRoot, pTarget); return true; } else { return false; } } //红黑树的删除节点与二叉树的删除过程一样,只是删除后使用颜色对树的平衡度进行了修正 /* 回顾一下二叉树的节点删除操作,4种情况: 1.没有左右子树 2.只有1个左子树 3.只有1个右子树 4.有2个子树,左右都有 解决方案: 1:没有左右子树 方案1:直接删除,再回马枪告诉父节点(左or右)已经删除,若父节点无,则root为空 2:只有一个左子树 方案2:直接删除,再回马枪告诉父节点(左or右)已经删除,重新链接上删除节点的左子树,并重新设置左子树父节点 或父节点无,则把删除节点的左子树设置成root 3:只有一个右子树 方案3:与方案2逻辑一样。举一反三即可 4:左右子树都存在 方案4:将删除节点的 左子树的最右节点 或 右子树的最左节点替换(左=前继;右=后继) 1.取出右孩子的后继最左节点,与需要删除的目标节点替换。 2.或后继最左节点存在,这个节点必然是最左,不可能存在左孩子。但可能存在右孩子 3.若后继最左节点不存在。则采用右孩子替换 :: */ template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { #ifdef _RBTREE_DEBUG Info(&quot;------------------------------------------------------------------------------------------------------------&quot;); #endif RBTreeNode&lt;KEY,VALUE&gt;* pParent = _pTargetNode-&gt;m_pParent;//目标节点的父节点 RBTreeNode&lt;KEY,VALUE&gt;* pLeft = _pTargetNode-&gt;m_pLeft;//目标节点的左节点 RBTreeNode&lt;KEY,VALUE&gt;* pRight = _pTargetNode-&gt;m_pRight;//目标节点的右节点 RBTreeNode&lt;KEY,VALUE&gt;* pPrecursor = pLeft;//中序遍历的前继节点(可能是左孩子或者是左孩子的最右节点) RBTreeNode&lt;KEY,VALUE&gt;* pPreParent = nullptr;//前继节点的父节点 RBTreeNode&lt;KEY,VALUE&gt;* pPreRight = nullptr;//前继节点的右孩子 RBTreeNode&lt;KEY,VALUE&gt;* pPreLeft = nullptr;//前继节点的左孩子 RBTreeNode&lt;KEY,VALUE&gt;* pTmp = nullptr; Color clrTarget = _pTargetNode-&gt;m_Color;//备份删除目标的颜色 Color clrPrecursor = Color::BLACK;//仅初始化前继节点的颜色,具体备份在下面代码过程中备份 Fork forkTarget = _pTargetNode-&gt;m_Fork;//备份删除目标位于其父的方位 //1没有左右子树 if (!pLeft &amp;&amp; !pRight) { if (_pTargetNode-&gt;m_Color == Color::RED) { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 元素信息: 左右孩子为空; 红色&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif remove_leaf_red(_pRoot, _pTargetNode); } else { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 元素信息: 左右孩子为空; 黑色&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif remove_leaf_black(_pRoot, _pTargetNode); } } else if (pLeft &amp;&amp; pRight)//左右子树都存在 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 元素信息: 左右孩子都存在&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key); #endif //尝试从左孩子中找出最右前继节点 pPreRight = pPrecursor-&gt;m_pRight;//获取前继右节点 while (pPreRight)//若前继节点的最右节点存在 { pPrecursor = pPreRight;//更新前继节点(最右) pPreRight = pPrecursor-&gt;m_pRight;//继续向右查找最右节点 } clrPrecursor = pPrecursor-&gt;m_Color;//备份前继节点的颜色 //交换颜色,这样就伪装成了,只交换元素,不交换颜色 pPrecursor-&gt;m_Color = clrTarget; _pTargetNode-&gt;m_Color = clrPrecursor; if (pPrecursor != pLeft)//仅有一种情况,找到了前继最右节点 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 找到了前继最右节点{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pPrecursor-&gt;m_Key); #endif //检测前继最右节点是否拥有左孩子(绝对不可能存在右孩子,否则就不是最右节点了) pPreParent = pPrecursor-&gt;m_pParent;//取出前继节点的父节点 pPreLeft = pPrecursor-&gt;m_pLeft;//取出前继节点的左孩子 //把删除目标节点放置到前继节点的位置, 链接操作开始 pPreParent-&gt;m_pRight = _pTargetNode;//设置前继点的父节点的右孩子为删除目标节点 _pTargetNode-&gt;m_pParent = pPreParent;//回马枪,通知删除目标设置父节点为前继点的父节点 _pTargetNode-&gt;m_Fork = Fork::RIGHT;//设置删除目标节点的方位为右孩子 _pTargetNode-&gt;m_pRight = nullptr;//重新设置删除目标的右孩子.因为和前继最右是没有右孩子的,不然就不是最右节点了 pPrecursor-&gt;m_pLeft = nullptr; // AI关键修复 pPrecursor-&gt;m_pRight = nullptr; if (pPreLeft)//如果前继最右节点存在左孩子 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 找到了前继最右节点{:d}, 并且存在左孩子{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pPrecursor-&gt;m_Key, pPreLeft-&gt;m_Key); #endif _pTargetNode-&gt;m_pLeft = pPreLeft;//把删除目标的左孩子设置成前继最右节点的左孩子 pPreLeft-&gt;m_pParent = _pTargetNode;//回马枪通知前继最右节点更改父节点为删除目标 } else//前继最右节点没有左孩子 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 找到了前继最右节点{:d}, 并且不存在左孩子&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pPrecursor-&gt;m_Key); #endif _pTargetNode-&gt;m_pLeft = nullptr; } //把删除目标节点放置到前继节点的位置, 链接操作完成 //把前继节点放置到删除目标节点的位置, 链接操作开始 switch (forkTarget) { case Fork::LEFT: pParent-&gt;m_pLeft = pPrecursor; pPrecursor-&gt;m_Fork = Fork::LEFT; pPrecursor-&gt;m_pParent = pParent; pPrecursor-&gt;m_pLeft = pLeft; pPrecursor-&gt;m_pRight = pRight; pLeft-&gt;m_pParent = pPrecursor; pRight-&gt;m_pParent = pPrecursor; break; case Fork::RIGHT: pParent-&gt;m_pRight = pPrecursor; pPrecursor-&gt;m_Fork = Fork::RIGHT; pPrecursor-&gt;m_pParent = pParent; pPrecursor-&gt;m_pLeft = pLeft; pPrecursor-&gt;m_pRight = pRight; pLeft-&gt;m_pParent = pPrecursor; pRight-&gt;m_pParent = pPrecursor; break; case Fork::ROOT: _pRoot = pPrecursor; pPrecursor-&gt;m_Fork = Fork::ROOT; pPrecursor-&gt;m_pParent = pParent; pPrecursor-&gt;m_pLeft = pLeft; pPrecursor-&gt;m_pRight = pRight; pLeft-&gt;m_pParent = pPrecursor; pRight-&gt;m_pParent = pPrecursor; break; } //把前继节点放置到删除目标节点的位置, 链接操作完成 } else//找不到前继最右节点,即目前的前继节点就是删除目标的左孩子 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}, 找不到前继最右节点,前继节点就是其左孩子{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pPrecursor-&gt;m_Key); #endif //把删除目标节点放置到前继节点的位置, 链接操作开始 _pTargetNode-&gt;m_pRight = nullptr;//原前继节点没有右孩子 _pTargetNode-&gt;m_pLeft = pPreLeft;//设置删除目标的左孩子为前继的左孩子 if (pPreLeft)pPreLeft-&gt;m_pParent = _pTargetNode;//如果前继节点的左孩子存在,则设置父节点为删除目标 _pTargetNode-&gt;m_pParent = pPrecursor;//把删除目标的父节点设置为前继节点 pPrecursor-&gt;m_pLeft = _pTargetNode;//把前继节点的左孩子设置成删除目标 _pTargetNode-&gt;m_Fork = Fork::LEFT;//把删除目标的方位设置成左孩子 pPrecursor-&gt;m_pRight = pRight;//把前继节点的右孩子设置删除目标的右孩子 pRight-&gt;m_pParent = pPrecursor;//把删除目标的右孩子父节点设置成前继节点 //把删除目标节点放置到前继节点的位置, 链接操作完成 //把前继节点放置到删除目标节点的位置, 链接操作开始 switch (forkTarget) { case Fork::LEFT: pParent-&gt;m_pLeft = pPrecursor; pPrecursor-&gt;m_pParent = pParent; pPrecursor-&gt;m_Fork = Fork::LEFT; break; case Fork::RIGHT: pParent-&gt;m_pRight = pPrecursor; pPrecursor-&gt;m_pParent = pParent; pPrecursor-&gt;m_Fork = Fork::RIGHT; break; case Fork::ROOT: pPrecursor-&gt;m_pParent = pParent; _pRoot = pPrecursor; pPrecursor-&gt;m_Fork = Fork::ROOT; break; } //把前继节点放置到删除目标节点的位置, 链接操作完成 } #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}与前继节点{:d}交换完成,准备递归返回执行过程&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pPrecursor-&gt;m_Key); #endif remove(_pRoot, _pTargetNode);//删除目标已经退化到达树的末端,重新递归进入删除树节点的过程 } else if(!pRight &amp;&amp; pLeft)//只有一个孩子,左子树 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}最有一个左孩子{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pLeft-&gt;m_Key); #endif // 可能会问: // 左孩子会不会也有左右孩子这类。 // 如果只有左孩子,没有右孩子的话。左孩子是不可能存在孩子了。红黑树不会成立 //删除目标节点与左子树交换,只换元素不换颜色 _pTargetNode-&gt;m_pLeft = nullptr;//把目标节点的左孩子设置为空. 因为左子树不存在孩子 _pTargetNode-&gt;m_pRight = nullptr;//把目标节点的右孩子设置为空. 因为左子树不存在孩子 _pTargetNode-&gt;m_pParent = pLeft;//把目标节点的父节点设置为左子树 _pTargetNode-&gt;m_Fork = Fork::LEFT; pLeft-&gt;m_pLeft = _pTargetNode;//把左子树的左孩子设置为删除目标 //pLeft-&gt;m_pRight = nullptr;//本来删除目标的右孩子就是空的 pLeft-&gt;m_pParent = pParent; switch (forkTarget) { case Fork::LEFT: pParent-&gt;m_pLeft = pLeft; pLeft-&gt;m_Fork = Fork::LEFT; break; case Fork::RIGHT: pParent-&gt;m_pRight = pLeft; pLeft-&gt;m_Fork = Fork::RIGHT; break; case Fork::ROOT: _pRoot = pLeft; pLeft-&gt;m_Fork = Fork::ROOT; break; } //删除目标与其左子树的颜色对调, 间接完成了2个节点之间只换元素不换颜色 _pTargetNode-&gt;m_Color = pLeft-&gt;m_Color; pLeft-&gt;m_Color = clrTarget; #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}与左孩子{:d}交换元素完成,准备递归返回执行过程&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pLeft-&gt;m_Key); #endif remove(_pRoot, _pTargetNode);//删除目标已经退化到达树的末端,重新递归进入删除树节点的过程 } else if (pRight &amp;&amp; !pLeft)////只有一个孩子,右子树 { #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}有一个右孩子{:d}&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pRight-&gt;m_Key); #endif // 可能会问: // 右孩子会不会也有左右孩子这类。 // 如果只有右孩子,没有左孩子的话。右孩子是不可能存在孩子了。红黑树不会成立 //删除目标节点与右子树交换,只换元素不换颜色 _pTargetNode-&gt;m_pLeft = nullptr; _pTargetNode-&gt;m_pRight = nullptr; _pTargetNode-&gt;m_pParent = pRight; _pTargetNode-&gt;m_Fork = Fork::RIGHT; pRight-&gt;m_pRight = _pTargetNode; pRight-&gt;m_pParent = pParent; switch (forkTarget) { case Fork::LEFT: pParent-&gt;m_pLeft = pRight; pRight-&gt;m_Fork = Fork::LEFT; break; case Fork::RIGHT: pParent-&gt;m_pRight = pRight; pRight-&gt;m_Fork = Fork::RIGHT; break; case Fork::ROOT: _pRoot = pRight; pRight-&gt;m_Fork = Fork::ROOT; break; } //删除目标与其左子树的颜色对调, 间接完成了2个节点之间只换元素不换颜色 _pTargetNode-&gt;m_Color = pRight-&gt;m_Color; pRight-&gt;m_Color = clrTarget; #ifdef _RBTREE_DEBUG Info(&quot;红黑树&lt;{}&gt;删除元素{:d}与右孩子{:d}交换元素完成,准备递归返回执行过程&quot;, fmt::ptr(this), _pTargetNode-&gt;m_Key, pRight-&gt;m_Key); #endif remove(_pRoot, _pTargetNode);//删除目标已经退化到达树的末端,重新递归进入删除树节点的过程 } if (m_pRoot) m_pRoot-&gt;m_Color = Color::BLACK;//强制设置根节点为黑色,红黑树特性:根必须为黑, // AI关键修复 } template&lt;class KEY, class VALUE&gt;//删除的叶子节点是红色,只需无条件删除即可 void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_red(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { RBTreeNode&lt;KEY,VALUE&gt;* pParent = _pTargetNode-&gt;m_pParent;//目标节点的父节点 Fork fork = _pTargetNode-&gt;m_Fork; delete _pTargetNode; _pTargetNode = nullptr; switch (fork) { case Fork::LEFT: pParent-&gt;m_pLeft = nullptr; break; case Fork::RIGHT: pParent-&gt;m_pRight = nullptr; break; case Fork::ROOT: _pRoot = nullptr; break; } } template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode, bool _bIsRemove) { RBTreeNode&lt;KEY,VALUE&gt;* pParent = _pTargetNode-&gt;m_pParent;//目标节点的父节点 RBTreeNode&lt;KEY,VALUE&gt;* pBrother = nullptr;//目标节点的兄弟节点 RBTreeNode&lt;KEY,VALUE&gt;* pBroLeft = nullptr;////兄弟节点的左孩子, 用作判断(近侄/远侄)节点 RBTreeNode&lt;KEY,VALUE&gt;* pBroRight = nullptr;//兄弟节点的右孩子, 用作判断(近侄/远侄)节点 //如果不是root根节点, 父节点肯定是存在 switch (_pTargetNode-&gt;m_Fork) { case Fork::LEFT://如果删除目标位于其父的左边**************************************************************** pBrother = pParent-&gt;m_pRight;//那么兄弟节点肯定是其父右边 pBroLeft = pBrother ? pBrother-&gt;m_pLeft : nullptr;//获取兄弟节点的左孩子(近侄) pBroRight = pBrother ? pBrother-&gt;m_pRight : nullptr;//获取兄弟节点的右孩子(远侄) //情况1: 兄弟节点为黑色; 父节点红或黑都可以; 远侄子节点为红色; 近侄节点红色或黑色都可,但如是黑色必然是null节点 if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; //兄弟节点为黑色 pBroRight &amp;&amp; pBroRight-&gt;m_Color == Color::RED//远侄子节点为红色,近侄无视(红黑都可以) ) { //测试过程:插入&lt;153;100;157;162&gt;删除100触发 //测试过程:插入&lt;153;100;160;157;162;164&gt;删除157触发 remove_leaf_black_case1(_pRoot, pParent, pBrother, pBroRight); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pLeft = nullptr; } } //情况2: 兄弟节点B为黑色; 父节点红或黑都可以; 近侄子节点为红色; 远侄子节点为黑色null(不可能为红,如果为红即是情况1了) else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK //兄弟节点为黑色 &amp;&amp; pBroLeft &amp;&amp; pBroLeft-&gt;m_Color==Color::RED //近侄节点为红色 &amp;&amp; ( (pBroRight&amp;&amp;pBroRight-&gt;m_Color==Color::BLACK) || !pBroRight )//远侄必然为黑色 ) { //测试过程: 插入&lt;153;100;157;155&gt;删除100触发 //测试过程: 插入&lt;153;100;160;157;162;161&gt;删除157 remove_leaf_black_case2(_pRoot, pBrother, pBroLeft);//得到情况1 remove_leaf_black(_pRoot, _pTargetNode, _bIsRemove);//递归进入情况1过程 } //情况3: 兄弟节点B为黑色; 父亲节P为红色; 兄弟节点的两个孩子(只能是null节点)都为黑色的情况,如果是黑色有效节点,红黑树黑色路径异常 else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; pParent-&gt;m_Color == Color::RED &amp;&amp; !pBroLeft &amp;&amp; !pBroRight ) { //测试过程: 插入&lt;153;100;161;157;162;165&gt;删除165, 之后再删除157触发 remove_leaf_black_case3(pParent, pBrother); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pLeft = nullptr; } } //情况4: 兄弟节点B为红色; 父节点P为黑(必然);侄子节点全是黑并非null(必然);必然指红黑树规则已经约束好,无须判断 else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::RED &amp;&amp; pParent-&gt;m_Color == Color::BLACK &amp;&amp; pBroLeft &amp;&amp; pBroLeft-&gt;m_Color == Color::BLACK &amp;&amp; pBroRight &amp;&amp; pBroRight-&gt;m_Color == Color::BLACK ) { //测试过程: 插入&lt;100;25;153;152;157;162&gt;删除25触发 remove_leaf_black_case4(_pRoot, pParent, pBrother);//得到情况3 remove_leaf_black(_pRoot, _pTargetNode, _bIsRemove);//递归进入情况3过程 } //情况5: 父亲节点P, 兄弟节点B和兄弟节点的两个孩子(只能为NULL节点)都为黑色的情况 else if ( pParent-&gt;m_Color == Color::BLACK &amp;&amp; pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; !pBroLeft &amp;&amp; !pBroRight ) { //测试过程: 插入&lt;100;25;162;10;50;152;175;5;150;157;153;149;151&gt;删除5再删除10触发 //测试过程: 插入&lt;100;25;162;10;50;152;175;5;150;157;153;149;151&gt;删除5再删除50触发 remove_leaf_black_case5(pBrother); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pLeft = nullptr; } remove_leaf_black(_pRoot, pParent, false); } break; case Fork::RIGHT://如果删除目标位于其父的右边**************************************************************** pBrother = pParent-&gt;m_pLeft;//那么兄弟节点肯定是其父左边 pBroLeft = pBrother ? pBrother-&gt;m_pLeft : nullptr;//获取兄弟节点的左孩子(远侄) pBroRight = pBrother ? pBrother-&gt;m_pRight : nullptr;//获取兄弟节点的右孩子(近侄) //情况1: 兄弟节点为黑色; 父节点红或黑都可以; 远侄子节点为红色; 近侄节点红色或黑色都可,但如是黑色必然是null节点 if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; //兄弟节点为黑色 pBroLeft &amp;&amp; pBroLeft-&gt;m_Color == Color::RED//远侄节点为红色,近侄无视(红黑都可以) ) { //测试过程:插入&lt;157;153;162;100&gt;删除162触发 //测试过程:插入&lt;170;180;162;160;164;157&gt;删除164触发 remove_leaf_black_case1(_pRoot, pParent, pBrother, pBroLeft); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pRight = nullptr; } } //情况2: 兄弟节点B为黑色; 父节点红或黑都可以; 近侄子节点为红色; 远侄子节点为黑色null(不可能为红,如果为红即是情况1了) else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp;//兄弟节点为黑色 pBroRight &amp;&amp; pBroRight-&gt;m_Color == Color::RED &amp;&amp; //近侄节点为红色 ( (pBroLeft &amp;&amp; pBroLeft-&gt;m_Color == Color::BLACK) || !pBroLeft )//远侄必然为黑色 ) { //测试过程:插入&lt;157;153;162;154&gt;删除162 //测试过程:插入&lt;170;180;162;160;164;161&gt;删除164 remove_leaf_black_case2(_pRoot, pBrother, pBroRight);//得到情况1 remove_leaf_black(_pRoot, _pTargetNode, _bIsRemove);//递归进入情况1过程 } //情况3: 兄弟节点B为黑色; 父亲节P为红色; 兄弟节点的两个孩子(只能是null节点)都为黑色的情况,如果是黑色有效节点,红黑树黑色路径异常 else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; pParent-&gt;m_Color == Color::RED &amp;&amp; !pBroLeft &amp;&amp; !pBroRight ) { //测试过程: 插入&lt;153;100;161;157;162;165&gt;删除165, 之后再删除162触发 remove_leaf_black_case3(pParent, pBrother); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pRight = nullptr; } } //情况4: 兄弟节点B为红色; 父节点P为黑(必然);侄子节点全是黑并非null(必然);必然指红黑树规则已经约束好,无须判断 else if ( pBrother &amp;&amp; pBrother-&gt;m_Color == Color::RED &amp;&amp; pParent-&gt;m_Color == Color::BLACK &amp;&amp; pBroLeft &amp;&amp; pBroLeft-&gt;m_Color == Color::BLACK &amp;&amp; pBroRight &amp;&amp; pBroRight-&gt;m_Color == Color::BLACK ) { //测试过程:插入&lt;100;125;53;52;57;45&gt;删除125 remove_leaf_black_case4(_pRoot, pParent, pBrother);//得到情况3 remove_leaf_black(_pRoot, _pTargetNode, _bIsRemove);//递归进入情况3过程 } //情况5: 父亲节点P, 兄弟节点B和兄弟节点的两个孩子(只能为NULL节点)都为黑色的情况 else if ( pParent-&gt;m_Color == Color::BLACK &amp;&amp; pBrother &amp;&amp; pBrother-&gt;m_Color == Color::BLACK &amp;&amp; !pBroLeft &amp;&amp; !pBroRight ) { //测试过程:插入&lt;100;62;125;110;150;52;75;155;50;57;53;49;51&gt;删除155再删除150触发 //测试过程:插入&lt;100;62;125;110;150;52;75;155;50;57;53;49;51&gt;删除155再删除110触发 remove_leaf_black_case5(pBrother); if (_bIsRemove) { delete _pTargetNode; _pTargetNode = nullptr; pParent-&gt;m_pRight = nullptr; } //remove_leaf_black(_pRoot, pParent, false); // AI关键修复 while (pParent &amp;&amp; pParent-&gt;m_Color == Color::BLACK /* 条件 */) { remove_leaf_black(_pRoot, pParent, false); } } break; case Fork::ROOT://**************************************************************** //测试过程: 插入&lt;1&gt; 删除1触发 delete _pTargetNode; _pTargetNode = nullptr; _pRoot = nullptr; break; } } //情况1: 兄弟节点为黑色; 父节点红或黑都可以; 远侄子节点为红色; 近侄节点红色或黑色都可,但近侄如是黑色必然是null节点 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black_case1(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pParent, RBTreeNode&lt;KEY,VALUE&gt;* _pBrother, RBTreeNode&lt;KEY,VALUE&gt;* _pBroChild) {//调整过程: 将P和B的颜色对调,然后对P树进行(左/右)旋操作,最后把(BR/BL)节点变成黑色,并删除D即可 Color clrParent = _pParent-&gt;m_Color;//备份父节点颜色 Color clrBrother = _pBrother-&gt;m_Color;//备份兄弟节点颜色 //将P和B节点颜色对调 _pParent-&gt;m_Color = clrBrother; _pBrother-&gt;m_Color = clrParent; switch (_pBrother-&gt;m_Fork) { case Fork::LEFT://如果兄弟位于其父的左边 right_rotate(_pRoot, _pParent);//将P进行右旋 break; case Fork::RIGHT://如果兄弟位于其父的右边 left_rotate(_pRoot, _pParent);//将P进行左旋 break; case Fork::ROOT: #ifdef _RBTREE_DEBUG assert(false);//异常,不可能到达 #endif break; } //将远侄节点设置成黑色 _pBroChild-&gt;m_Color = Color::BLACK; } //情况2: 兄弟节点B为黑色; 父节点红或黑都可以; 近侄子节点为红色; 远侄子节点为黑色null(不可能为红,如果为红即是情况1了) template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black_case2(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pBrother, RBTreeNode&lt;KEY,VALUE&gt;* _pBroChild) {//调整过程: 将B(左 / 右)旋转, 并将B和(BL / BR)颜色调换, 这时候就得到情况1 Color clrBrother = _pBrother-&gt;m_Color;//备份兄弟节点的颜色 Color clrBroChild = _pBroChild-&gt;m_Color;//备作近侄节点的颜色 //兄弟节点与近侄节点交换颜色 _pBrother-&gt;m_Color = clrBroChild; _pBroChild-&gt;m_Color = clrBrother; switch (_pBrother-&gt;m_Fork) { case Fork::LEFT://如果兄弟位于其父的左边 left_rotate(_pRoot, _pBrother);//将B进行左旋 break; case Fork::RIGHT://如果兄弟位于其父的右边 right_rotate(_pRoot, _pBrother);//将B进行右旋 break; case Fork::ROOT: #ifdef _RBTREE_DEBUG assert(false);//异常,不可能到达 #endif break; } } //情况3: 兄弟节点B为黑色; 父亲节P为红色; 兄弟节点的两个孩子(只能是null节点)都为黑色的情况, 如果是黑色有效节点, 红黑树黑色路径异常 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black_case3(RBTreeNode&lt;KEY,VALUE&gt;* _pParent, RBTreeNode&lt;KEY,VALUE&gt;* _pBrother) {//调整过程: 将父亲节点P改成黑色,将兄弟节点B改成红色,然后删除D即可 _pParent-&gt;m_Color = Color::BLACK; _pBrother-&gt;m_Color = Color::RED; } //情况4: 兄弟节点B为红色; 父节点P为黑(必然); 侄子节点全是黑并非null(必然); 必然指红黑树规则已经约束好, 无须判断 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black_case4(RBTreeNode&lt;KEY,VALUE&gt;*&amp; _pRoot, RBTreeNode&lt;KEY,VALUE&gt;* _pParent, RBTreeNode&lt;KEY,VALUE&gt;* _pBrother) {//情况4: 调整过程: 将父亲P和兄弟B的颜色调换, 然后将P进行(左 / 右)旋转操作, 得到情况3 Color clrParent = _pParent-&gt;m_Color;//备份父节点颜色 Color clrBrother = _pBrother-&gt;m_Color;//备份兄弟节点颜色 //父亲P与兄弟B颜色调换 _pParent-&gt;m_Color = clrBrother; _pBrother-&gt;m_Color = clrParent; switch (_pBrother-&gt;m_Fork) { case Fork::LEFT://如果兄弟节点位于左边, 删除目标位于右边 right_rotate(_pRoot, _pParent);//将P右旋 break; case Fork::RIGHT://如果兄弟节点位于右边,删除目标位于左边 left_rotate(_pRoot, _pParent);//将P左旋 break; case Fork::ROOT: #ifdef _RBTREE_DEBUG assert(false);//异常,不可能达到此处 #endif break; } } //情况5: 父亲节点P, 兄弟节点B和兄弟节点的两个孩子(只能为NULL节点)都为黑色的情况 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::remove_leaf_black_case5(RBTreeNode&lt;KEY,VALUE&gt;* _pBrother) { //情况5: 方法是将兄弟节点B的颜色改成红色,这样删除D后P的左右两支的黑节点数就相等了,但是经过P的路径上的黑色节点数会少1. // 这个时候,我们再以P为起始点,继续根据情况进行平衡操作 //(这句话的意思就是把P当成D(只是不要再删除P了),再看是那种情况,再进行对应的调整。这样一直向上,直到新的起始点为根节点) _pBrother-&gt;m_Color = Color::RED; } template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::Destroy() { if (m_pRoot)destroy(m_pRoot); m_pHead = nullptr; m_pTail = nullptr; } //查找红黑树是否存在Key template&lt;class KEY, class VALUE&gt; VALUE* RBTREE::RBTree&lt;KEY, VALUE&gt;::Find(const KEY&amp; _Instance) { RBTreeNode&lt;KEY, VALUE&gt;* pNode = search(m_pRoot, _Instance); if (pNode) { return &amp;pNode-&gt;m_Value; } return nullptr; } //递归清除整棵红黑树 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::destroy(RBTreeNode&lt;KEY,VALUE&gt;* _pTargetNode) { if (_pTargetNode-&gt;m_pLeft)destroy(_pTargetNode-&gt;m_pLeft); if (_pTargetNode-&gt;m_pRight)destroy(_pTargetNode-&gt;m_pRight); if (_pTargetNode) { if (_pTargetNode-&gt;m_Fork == Fork::ROOT)m_pRoot = nullptr; delete _pTargetNode; } } template&lt;class KEY, class VALUE&gt; VALUE&amp; RBTREE::RBTree&lt;KEY, VALUE&gt;::operator[](KEY&amp;&amp; _Instance) { RBTreeNode&lt;KEY, VALUE&gt;* pTarget = search(m_pRoot, _Instance); if (pTarget) { return pTarget-&gt;m_Value; } else { return *Insert(std::forward&lt;KEY&gt;(_Instance), VALUE()); } } //从链表中删除指定节点,实际不是删除,只是从链表中把指点重新双向链接起来 template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::list_remove(RBTreeNode&lt;KEY, VALUE&gt;* _pTargetNode) { RBTreeNode&lt;KEY, VALUE&gt;* pFront = _pTargetNode-&gt;m_pFront; RBTreeNode&lt;KEY, VALUE&gt;* pNext = _pTargetNode-&gt;m_pNext; if (!pFront) {//属于头节点 m_pHead = pNext; if (pNext)pNext-&gt;m_pFront = pFront; } else if (_pTargetNode == m_pTail) {//属于尾节点 if (!pFront) { m_pHead = nullptr; m_pTail = nullptr; } else { pFront-&gt;m_pNext = nullptr; m_pTail = pFront; } } else {//属于中间节点 pFront-&gt;m_pNext = pNext; if (pNext)pNext-&gt;m_pFront = pFront; } } #ifdef _RBTREE_DEBUG template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::PrintList() { RBTreeNode&lt;KEY, VALUE&gt;* pTarget = m_pHead; while (pTarget) { printf(&quot;%d\n&quot;, pTarget-&gt;m_Key); pTarget = pTarget-&gt;m_pNext; } } #endif template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::list_destroy(RBTreeNode&lt;KEY, VALUE&gt;*&amp; _pHead, RBTreeNode&lt;KEY, VALUE&gt;*&amp; _pTail) { RBTreeNode&lt;KEY, VALUE&gt;* pTarget = _pHead; RBTreeNode&lt;KEY, VALUE&gt;* pTmp = nullptr; _pHead = nullptr; _pTail = nullptr; while (pTarget) { pTmp = pTarget; pTarget = pTarget-&gt;m_pNext; delete pTmp; } } template&lt;class KEY, class VALUE&gt; void RBTREE::RBTree&lt;KEY, VALUE&gt;::ListDestroy() { list_destroy(m_pHead, m_pTail); m_pRoot = nullptr; } template&lt;class KEY, class VALUE&gt; RBTREE::RBTree&lt;KEY, VALUE&gt;::list_iterator::list_iterator(RBTreeNode&lt;KEY, VALUE&gt;* _pListNode):m_pIndex(_pListNode){} template&lt;class KEY, class VALUE&gt; RBTREE::RBTree&lt;KEY, VALUE&gt;::list_iterator::~list_iterator(){} template&lt;class KEY, class VALUE&gt; bool RBTREE::RBTree&lt;KEY, VALUE&gt;::list_iterator::operator!=(RBTreeNode&lt;KEY, VALUE&gt;* _pListNode) { return m_pIndex != _pListNode; } template&lt;class KEY, class VALUE&gt; typename RBTREE::RBTree&lt;KEY,VALUE&gt;::list_iterator&amp; RBTREE::RBTree&lt;KEY,VALUE&gt;::list_iterator::operator++() { m_pIndex = m_pIndex-&gt;m_pNext; return *this; } template&lt;class KEY, class VALUE&gt; typename RBTREE::RBTree&lt;KEY, VALUE&gt;::list_iterator&amp; RBTREE::RBTree&lt;KEY, VALUE&gt;::list_iterator::operator++(int) { list_iterator iter = *this; m_pIndex = m_pIndex-&gt;m_pNext; return iter; } #endif // !__RBTREE_H__ 我已经修复完成了,再帮我详细看看
07-03
#ifndef _RBTREE_ITERATOR_H_ #define _RBTREE_ITERATOR_H_ #include &lt;iterator&gt; #include &lt;stack&gt; namespace RBTREE { template&lt;class KEY, class VALUE&gt; class RBTree; // 前向声明 template&lt;class KEY, class VALUE&gt; class RBTreeIterator { public: using iterator_category = std::forward_iterator_tag; using value_type = std::pair&lt;const KEY, VALUE&gt;; using difference_type = std::ptrdiff_t; using pointer = value_type*; using reference = value_type&amp;; // 构造函数 RBTreeIterator() : m_pCurrent(nullptr) {} // 从节点指针构造迭代器 explicit RBTreeIterator(RBTreeNode&lt;KEY, VALUE&gt;* node) : m_pCurrent(node) {} // 解引用操作符 reference operator*() const { return std::make_pair(m_pCurrent-&gt;m_Key, m_pCurrent-&gt;m_Value); } pointer operator-&gt;() const { return &amp;operator*(); } // 前缀递增操作符 RBTreeIterator&amp; operator++() { if (m_pCurrent-&gt;isNIL()) { m_pCurrent = nullptr; return *this; } // 如果右子树不为空,则找到右子树的最左节点 if (!m_pCurrent-&gt;m_pRight-&gt;isNIL()) { m_pCurrent = m_pCurrent-&gt;m_pRight; while (!m_pCurrent-&gt;m_pLeft-&gt;isNIL()) { m_pCurrent = m_pCurrent-&gt;m_pLeft; } } else { // 否则,向上找到第一个是左孩子的祖先 RBTreeNode&lt;KEY, VALUE&gt;* pParent = m_pCurrent-&gt;m_pParent; while (pParent != nullptr &amp;&amp; m_pCurrent == pParent-&gt;m_pRight) { m_pCurrent = pParent; pParent = pParent-&gt;m_pParent; } m_pCurrent = pParent; } return *this; } // 后缀递增操作符 RBTreeIterator operator++(int) { RBTreeIterator tmp = *this; ++(*this); return tmp; } // 比较操作符 bool operator==(const RBTreeIterator&amp; other) const { return m_pCurrent == other.m_pCurrent; } bool operator!=(const RBTreeIterator&amp; other) const { return !(*this == other); } private: RBTreeNode&lt;KEY, VALUE&gt;* m_pCurrent; // 友元声明,使RBTree可以访问私有成员 friend class RBTree&lt;KEY, VALUE&gt;; }; } #endif // _RBTREE_ITERATOR_H_ 这个才是我原始版本
07-24
请仔细阅读和分析下面函数,保持函数原始逻辑功能不变, 不要遗漏逻辑细节,进行优化后,采用C/C++11标准,完整推导并重构可编译的全部代码 要求如下: 1.保持原始函数定义不变,不要拆分函数 2.保持所有原始逻辑功能不变 3.结构体采用32位定义 4.严格保持protobuf字段映射关系,不要遗漏protobuf字段内容 5.提高执行效率,降低计算复杂度 6.已经给定的结构体名字和元素不要更改,详细的中文注释 7.自动添加中文注释说明功能逻辑 8.不使用 auto,使用显式 for 循环 特别注意: 1.函数中的 HDDMXng::BelDef::BelDef 映射为 message BelDef { optional bool optinv = 1; optional bool rbel = 2; optional string belname = 3; optional uint32 numoutputpins = 4; optional uint32 numinputpins = 5; optional uint32 numpins = 6; optional uint32 numsrcs = 7; optional uint32 numprims = 8; repeated uint32 srcgnds = 9 [packed = true]; repeated BelDefPip pips = 10; optional bool hasusagedef = 11; } 其中,依赖消息有: message BelDefPip { optional uint32 pin1 = 1; optional uint32 pin2 = 2; repeated AttrSetting attrsettings = 3; } message AttrSetting { optional string attrname = 1; optional string attrvalue = 2; } 2.将函数中 _BYTE beldef_msg[16] 映射为 HDDMXng::BelDef beldef_msg void HDDMBelDef::HDDMBelDef(HDDMBelDef *this) { int beldef_code; // eax unsigned int v2; // eax LOWORD(this-&gt;beldef_code) &amp;= 0xC000u; LOBYTE(this-&gt;beldef_code1) &amp;= 0xF0u; LODWORD(this-&gt;char40) = 0; this-&gt;qword48 = 0LL; this-&gt;qword60 = 0LL; this-&gt;hddmPrimitive = 0LL; this-&gt;vtable = &amp;`vtable for&#39;HDDMBelDef + 2; beldef_code = this-&gt;beldef_code; this-&gt;qword30 = 0LL; this-&gt;pipsMatrixVec = 0LL; this-&gt;hddmBelPinDefArray = 0LL; this-&gt;hddmBelUsageDef = 0LL; beldef_code &amp;= 0xF0003FFF; this-&gt;beldef_code = beldef_code; HIBYTE(this-&gt;beldef_code) = HIBYTE(beldef_code) &amp; 0xCF; v2 = this-&gt;beldef_code1 &amp; 0xFFFC000F; this-&gt;beldef_code1 = v2; HIWORD(this-&gt;beldef_code1) = HIWORD(v2) | 0x3FFC; this-&gt;belDef_name = (std::string *)((char *)&amp;std::string::_Rep::_S_empty_rep_storage + 24); this-&gt;qword50 = &amp;this-&gt;char40; this-&gt;qword58 = &amp;this-&gt;char40; } void __fastcall HDDMBelDef::~HDDMBelDef(HDDMBelDef *this) { HDDMPrimitive *hddmPrimitive; // rbp _QWORD *vtable; // rbx _QWORD *v4; // rax void *v5; // rdi _QWORD *qword20; // rsi unsigned __int16 v7; // ax __int64 v8; // rbx void *v9; // rdi HDDMBelPinDef *v10; // rdi HDDMBelPinDef *v11; // rbx HDDMBelPinDef *v12; // rbx HDDMBelPinDef *v13; // rdi HDDMBelPinDef *v14; // rbp _QWORD *qword30; // rbx HDDMBelUsageDef *hddmBelUsageDef; // rbx HDDMBelDef *i; // r14 HDDMBelPinDef *hddmBelPinDefArray; // r13 char *pindef_name; // r8 char *v20; // r15 char *v21; // rbx _QWORD *v22; // r9 __int64 v23; // rdx void *v24; // rdi void *v25; // rdi __int64 v26; // rdx __int64 v27; // rdx void *v28; // rdi int v29; // ecx int v30; // ecx char *v31; // [rsp+10h] [rbp-58h] char *v32; // [rsp+10h] [rbp-58h] char *v33; // [rsp+10h] [rbp-58h] char *v34; // [rsp+10h] [rbp-58h] _QWORD *v35; // [rsp+18h] [rbp-50h] _QWORD *v36; // [rsp+18h] [rbp-50h] _QWORD *v37; // [rsp+18h] [rbp-50h] _QWORD *v38; // [rsp+18h] [rbp-50h] _BYTE v39[57]; // [rsp+2Fh] [rbp-39h] BYREF hddmPrimitive = this-&gt;hddmPrimitive; this-&gt;vtable = &amp;`vtable for&#39;HDDMBelDef + 2; if ( hddmPrimitive ) { vtable = (_QWORD *)hddmPrimitive-&gt;vtable; v4 = *(_QWORD **)&amp;hddmPrimitive-&gt;numPrimType; if ( (_QWORD *)hddmPrimitive-&gt;vtable == v4 ) { v5 = (void *)hddmPrimitive-&gt;vtable; } else { do { if ( *vtable ) { (*(void (__fastcall **)(_QWORD))(*(_QWORD *)*vtable + 24LL))(*vtable); hddmPrimitive = this-&gt;hddmPrimitive; v4 = *(_QWORD **)&amp;hddmPrimitive-&gt;numPrimType; } ++vtable; } while ( vtable != v4 ); v5 = (void *)hddmPrimitive-&gt;vtable; } if ( v5 ) operator delete(v5); operator delete(hddmPrimitive); this-&gt;hddmPrimitive = 0LL; } qword20 = (_QWORD *)this-&gt;pipsMatrixVec; if ( qword20 ) { v7 = (this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF; if ( !v7 ) goto LABEL_17; v8 = 0LL; do { v9 = (void *)qword20[v8]; if ( v9 ) { operator delete[](v9); *(_QWORD *)(this-&gt;pipsMatrixVec + 8 * v8) = 0LL; qword20 = (_QWORD *)this-&gt;pipsMatrixVec; v7 = (this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF; } ++v8; } while ( v7 &gt; (int)v8 ); if ( qword20 ) LABEL_17: operator delete[](qword20); this-&gt;pipsMatrixVec = 0LL; } if ( this-&gt;qword60 ) { for ( i = (HDDMBelDef *)this-&gt;qword50; i != (HDDMBelDef *)&amp;this-&gt;char40; i = (HDDMBelDef *)std::_Rb_tree_increment(i) ) { hddmBelPinDefArray = i-&gt;hddmBelPinDefArray; if ( hddmBelPinDefArray ) { pindef_name = (char *)hddmBelPinDefArray-&gt;pindef_name; v20 = *(char **)&amp;hddmBelPinDefArray-&gt;pindef_code; if ( pindef_name == *(char **)&amp;hddmBelPinDefArray-&gt;pindef_code ) { v25 = (void *)hddmBelPinDefArray-&gt;pindef_name; } else { v21 = *(char **)&amp;hddmBelPinDefArray-&gt;pindef_code; v22 = v20 + 8; if ( &amp;_pthread_key_create ) { do { v23 = *(_QWORD *)((char *)v22 + v21 - v20); if ( (_UNKNOWN *)(v23 - 24) != &amp;std::string::_Rep::_S_empty_rep_storage &amp;&amp; _InterlockedExchangeAdd((volatile signed __int32 *)(v23 - 8), 0xFFFFFFFF) &lt;= 0 ) { v36 = v22; v32 = pindef_name; std::string::_Rep::_M_destroy(v23 - 24, v39); v22 = v36; pindef_name = v32; } v24 = (void *)(*(_QWORD *)v21 - 24LL); if ( v24 != &amp;std::string::_Rep::_S_empty_rep_storage &amp;&amp; _InterlockedExchangeAdd((volatile signed __int32 *)(*(_QWORD *)v21 - 8LL), 0xFFFFFFFF) &lt;= 0 ) { v35 = v22; v31 = pindef_name; std::string::_Rep::_M_destroy(v24, v39); v22 = v35; pindef_name = v31; } v21 += 16; } while ( pindef_name != v21 ); } else { do { v26 = *(_QWORD *)((char *)v22 + v21 - v20); if ( (_UNKNOWN *)(v26 - 24) != &amp;std::string::_Rep::_S_empty_rep_storage ) { v29 = *(_DWORD *)(v26 - 8); *(_DWORD *)(v26 - 8) = v29 - 1; if ( v29 &lt;= 0 ) { v37 = v22; v33 = pindef_name; std::string::_Rep::_M_destroy(v26 - 24, v39); v22 = v37; pindef_name = v33; } } v27 = *(_QWORD *)v21; v28 = (void *)(*(_QWORD *)v21 - 24LL); if ( v28 != &amp;std::string::_Rep::_S_empty_rep_storage ) { v30 = *(_DWORD *)(v27 - 8); *(_DWORD *)(v27 - 8) = v30 - 1; if ( v30 &lt;= 0 ) { v38 = v22; v34 = pindef_name; std::string::_Rep::_M_destroy(v28, v39); v22 = v38; pindef_name = v34; } } v21 += 16; } while ( pindef_name != v21 ); } v25 = *(void **)&amp;hddmBelPinDefArray-&gt;pindef_code; } if ( v25 ) operator delete(v25); operator delete(hddmBelPinDefArray); } } } v10 = this-&gt;hddmBelPinDefArray; if ( v10 ) { v11 = &amp;v10[v10[-1].pindef_name]; if ( v10 != v11 ) { v12 = v11 - 1; do { v13 = v12; v14 = v12--; HDDMBelPinDef::~HDDMBelPinDef(v13); v10 = this-&gt;hddmBelPinDefArray; } while ( v10 != v14 ); } operator delete[](&amp;v10[-1].pindef_name); this-&gt;hddmBelPinDefArray = 0LL; } qword30 = (_QWORD *)this-&gt;qword30; if ( qword30 ) { std::_Rb_tree&lt;std::string,std::pair&lt;std::string const,HDDMBelPinDef *&gt;,std::_Select1st&lt;std::pair&lt;std::string const,HDDMBelPinDef *&gt;&gt;,std::less&lt;std::string&gt;,std::allocator&lt;std::pair&lt;std::string const,HDDMBelPinDef *&gt;&gt;&gt;::_M_erase( this-&gt;qword30, qword30[2]); operator delete(qword30); this-&gt;qword30 = 0LL; } hddmBelUsageDef = this-&gt;hddmBelUsageDef; if ( hddmBelUsageDef ) { HDDMBelUsageDef::~HDDMBelUsageDef(this-&gt;hddmBelUsageDef); operator delete(hddmBelUsageDef); } this-&gt;hddmBelUsageDef = 0LL; sub_21726B0(this); std::_Rb_tree&lt;std::pair&lt;unsigned short,unsigned short&gt;,std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;,std::_Select1st&lt;std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;&gt;,std::less&lt;std::pair&lt;unsigned short,unsigned short&gt;&gt;,std::allocator&lt;std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;&gt;&gt;::_M_erase( &amp;this-&gt;field_38, this-&gt;qword48); std::string::_Rep::_M_dispose((char *)this-&gt;belDef_name - 24, v39); } void __fastcall HDDMBelDef::addpindefs(HDDMBelDef *this, __int16 index) { HDDMBelPinDef *hddmBelPinDefArray; // rbx unsigned __int16 v3; // r12 unsigned __int64 v4; // r14 __int64 v5; // r12 HDDMBelPinDef *v6; // rax HDDMBelPinDef *v7; // rdx char v8; // cl char v9; // cl char v10; // cl char v11; // cl char v12; // cl char v13; // cl char v14; // cl char v15; // cl char v16; // cl char v17; // cl char v18; // cl char v19; // cl char v20; // cl const std::string *p_pindef_name; // rsi HDDMBelPinDef *i; // rbp hddmBelPinDefArray = this-&gt;hddmBelPinDefArray; v3 = this-&gt;beldef_code &amp; 0x3FFF; HDDMBelDef::allocatepindefs(this, v3 + index); if ( v3 ) { v4 = 0LL; v5 = 16 * ((unsigned int)v3 - 1 + 1LL); do { v6 = &amp;this-&gt;hddmBelPinDefArray[v4 / 0x10]; v7 = &amp;hddmBelPinDefArray[v4 / 0x10]; v8 = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 1 | v6-&gt;pindef_code &amp; 0xFE; LOBYTE(v6-&gt;pindef_code) = v8; v9 = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 2 | v8 &amp; 0xFD; LOBYTE(v6-&gt;pindef_code) = v9; v10 = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 4 | v9 &amp; 0xFB; LOBYTE(v6-&gt;pindef_code) = v10; v11 = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 8 | v10 &amp; 0xF7; LOBYTE(v6-&gt;pindef_code) = v11; v12 = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 0x10 | v11 &amp; 0xEF; LOBYTE(v6-&gt;pindef_code) = v12; LOBYTE(v6-&gt;pindef_code) = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 0x20 | v12 &amp; 0xDF; v6-&gt;pindef_code = hddmBelPinDefArray[v4 / 0x10].pindef_code &amp; 0xFFFC0 | v6-&gt;pindef_code &amp; 0xFFF0003F; BYTE2(v6-&gt;pindef_code) = BYTE2(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 0xF0 | BYTE2(v6-&gt;pindef_code) &amp; 0xF; v13 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 1 | HIBYTE(v6-&gt;pindef_code) &amp; 0xFE; HIBYTE(v6-&gt;pindef_code) = v13; v14 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 2 | v13 &amp; 0xFD; HIBYTE(v6-&gt;pindef_code) = v14; v15 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 4 | v14 &amp; 0xFB; HIBYTE(v6-&gt;pindef_code) = v15; v16 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 8 | v15 &amp; 0xF7; HIBYTE(v6-&gt;pindef_code) = v16; v17 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 0x10 | v16 &amp; 0xEF; HIBYTE(v6-&gt;pindef_code) = v17; v18 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 0x20 | v17 &amp; 0xDF; HIBYTE(v6-&gt;pindef_code) = v18; v19 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 0x40 | v18 &amp; 0xBF; HIBYTE(v6-&gt;pindef_code) = v19; HIBYTE(v6-&gt;pindef_code) = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code) &amp; 0x80 | v19 &amp; 0x7F; LOBYTE(v6-&gt;pindef_code1) = hddmBelPinDefArray[v4 / 0x10].pindef_code1 &amp; 0xF | v6-&gt;pindef_code1 &amp; 0xF0; LOWORD(v6-&gt;pindef_code1) = hddmBelPinDefArray[v4 / 0x10].pindef_code1 &amp; 0xFFF0 | v6-&gt;pindef_code1 &amp; 0xF; HIWORD(v6-&gt;pindef_code1) = HIWORD(hddmBelPinDefArray[v4 / 0x10].pindef_code1) &amp; 0x3FF | HIWORD(v6-&gt;pindef_code1) &amp; 0xFC00; v20 = HIBYTE(hddmBelPinDefArray[v4 / 0x10].pindef_code1) &amp; 0x3C | HIBYTE(v6-&gt;pindef_code1) &amp; 0xC3; p_pindef_name = (const std::string *)&amp;hddmBelPinDefArray[v4 / 0x10].pindef_name; v4 += 16LL; HIBYTE(v6-&gt;pindef_code1) = v20; HIBYTE(v6-&gt;pindef_code1) = HIBYTE(v7-&gt;pindef_code1) &amp; 0xC0 | v20 &amp; 0x3F; std::string::assign((std::string *)&amp;v6-&gt;pindef_name, p_pindef_name); } while ( v4 != v5 ); } if ( hddmBelPinDefArray ) { for ( i = &amp;hddmBelPinDefArray[hddmBelPinDefArray[-1].pindef_name]; hddmBelPinDefArray != i; HDDMBelPinDef::~HDDMBelPinDef(i) ) { --i; } operator delete[](&amp;hddmBelPinDefArray[-1].pindef_name); } } __int64 __fastcall HDDMBelDef::addpipattrsetting( HDDMBelDef *this, unsigned __int16 a2, unsigned __int16 a3, const std::string *a4, const std::string *a5) { const std::string *v5; // r10 _QWORD *p_char40; // r14 __int64 qword48; // rax _QWORD *v10; // r9 _QWORD *v11; // rbp __int64 v12; // rax _QWORD *v13; // r8 _QWORD *v14; // rbx __int64 v15; // rax __int64 insert_hint_unique_pos; // rax __int64 v17; // rdx _QWORD *v18; // rbx __int64 v19; // rdi _QWORD *v20; // rax __int64 v21; // rax char *v22; // rdi __int64 result; // rax char *v24; // rdi unsigned __int16 v25; // ax int v26; // eax int v27; // edx unsigned int v28; // edx _WORD *v30; // [rsp+8h] [rbp-70h] char v33; // [rsp+2Fh] [rbp-49h] BYREF char *v34; // [rsp+30h] [rbp-48h] BYREF char *v35; // [rsp+38h] [rbp-40h] BYREF v5 = a4; p_char40 = &amp;this-&gt;char40; qword48 = this-&gt;qword48; if ( !qword48 ) goto LABEL_10; v10 = &amp;this-&gt;char40; do { while ( a2 &lt;= *(_WORD *)(qword48 + 32) &amp;&amp; (a2 &lt; *(_WORD *)(qword48 + 32) || a3 &lt;= *(_WORD *)(qword48 + 34)) ) { v10 = (_QWORD *)qword48; qword48 = *(_QWORD *)(qword48 + 16); if ( !qword48 ) goto LABEL_8; } qword48 = *(_QWORD *)(qword48 + 24); } while ( qword48 ); LABEL_8: if ( p_char40 == v10 || a2 &lt; *((_WORD *)v10 + 16) || a2 &lt;= *((_WORD *)v10 + 16) &amp;&amp; a3 &lt; *((_WORD *)v10 + 17) ) { LABEL_10: v11 = (_QWORD *)operator new(0x18uLL); *v11 = 0LL; v11[1] = 0LL; v11[2] = 0LL; v12 = this-&gt;qword48; v13 = &amp;this-&gt;char40; v5 = a4; if ( !v12 ) goto LABEL_16; do { if ( a2 &gt; *(_WORD *)(v12 + 32) || a2 &gt;= *(_WORD *)(v12 + 32) &amp;&amp; a3 &gt; *(_WORD *)(v12 + 34) ) { v12 = *(_QWORD *)(v12 + 24); } else { v13 = (_QWORD *)v12; v12 = *(_QWORD *)(v12 + 16); } } while ( v12 ); if ( p_char40 == v13 || a2 &lt; *((_WORD *)v13 + 16) || a2 &lt;= *((_WORD *)v13 + 16) &amp;&amp; a3 &lt; *((_WORD *)v13 + 17) ) { LABEL_16: v14 = v13; v15 = operator new(0x30uLL); if ( v15 ) { *(_DWORD *)v15 = 0; *(_QWORD *)(v15 + 8) = 0LL; *(_QWORD *)(v15 + 16) = 0LL; *(_QWORD *)(v15 + 24) = 0LL; *(_WORD *)(v15 + 32) = a2; *(_WORD *)(v15 + 34) = a3; *(_QWORD *)(v15 + 40) = 0LL; } v30 = (_WORD *)v15; insert_hint_unique_pos = std::_Rb_tree&lt;std::pair&lt;unsigned short,unsigned short&gt;,std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;,std::_Select1st&lt;std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;&gt;,std::less&lt;std::pair&lt;unsigned short,unsigned short&gt;&gt;,std::allocator&lt;std::pair&lt;std::pair&lt;unsigned short,unsigned short&gt; const,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt; *&gt;&gt;&gt;::_M_get_insert_hint_unique_pos( &amp;this-&gt;field_38, v14, v15 + 32); v18 = (_QWORD *)insert_hint_unique_pos; if ( v17 ) { v19 = 1LL; if ( !insert_hint_unique_pos &amp;&amp; p_char40 != (_QWORD *)v17 ) { v25 = *(_WORD *)(v17 + 32); if ( v30[16] &gt;= v25 &amp;&amp; (v30[16] &gt; v25 || v30[17] &gt;= *(_WORD *)(v17 + 34)) ) v19 = 0LL; } std::_Rb_tree_insert_and_rebalance(v19, v30, v17, p_char40); ++this-&gt;qword60; v13 = v30; v5 = a4; } else { operator delete(v30); v13 = v18; v5 = a4; } } v13[5] = v11; } else { v11 = (_QWORD *)v10[5]; } std::string::string((std::string *)&amp;v34, v5); std::string::string((std::string *)&amp;v35, a5); v20 = (_QWORD *)v11[1]; if ( v20 == (_QWORD *)v11[2] ) { std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt;::_M_emplace_back_aux&lt;std::pair&lt;std::string,std::string&gt;&gt;(v11, &amp;v34); } else { if ( v20 ) { *v20 = v34; v34 = (char *)&amp;std::string::_Rep::_S_empty_rep_storage + 24; v20[1] = v35; v35 = (char *)&amp;std::string::_Rep::_S_empty_rep_storage + 24; v21 = v11[1]; } else { v21 = 0LL; } v11[1] = v21 + 16; } v22 = v35 - 24; if ( v35 - 24 != (char *)&amp;std::string::_Rep::_S_empty_rep_storage ) { if ( &amp;_pthread_key_create ) { v26 = _InterlockedExchangeAdd((volatile signed __int32 *)v22 + 4, 0xFFFFFFFF); } else { v27 = *((_DWORD *)v35 - 2); *((_DWORD *)v35 - 2) = v27 - 1; v26 = v27; } if ( v26 &lt;= 0 ) std::string::_Rep::_M_destroy(v22, &amp;v33); } result = (__int64)v34; v24 = v34 - 24; if ( v34 - 24 != (char *)&amp;std::string::_Rep::_S_empty_rep_storage ) { if ( &amp;_pthread_key_create ) { result = (unsigned int)_InterlockedExchangeAdd((volatile signed __int32 *)v24 + 4, 0xFFFFFFFF); } else { v28 = *((_DWORD *)v34 - 2); *((_DWORD *)v34 - 2) = v28 - 1; result = v28; } if ( (int)result &lt;= 0 ) return std::string::_Rep::_M_destroy(v24, &amp;v33); } return result; } void __fastcall HDDMBelDef::addprimitive(HDDMBelDef *this, HDDMPrimitive *pHddmPrimitive) { HDDMPrimitive *hddmPrimitive; // rdi HDDMPrimitive **v4; // rdx __int64 v5; // rdx HDDMPrimitive *v6; // rax HDDMPrimitive *v7; // [rsp+8h] [rbp-10h] BYREF hddmPrimitive = this-&gt;hddmPrimitive; v7 = pHddmPrimitive; if ( !hddmPrimitive ) { v6 = (HDDMPrimitive *)operator new(0x18uLL); v6-&gt;vtable = 0LL; *(_QWORD *)&amp;v6-&gt;numPrimType = 0LL; hddmPrimitive = v6; v6-&gt;hddmBelDef = 0LL; this-&gt;hddmPrimitive = v6; } v4 = *(HDDMPrimitive ***)&amp;hddmPrimitive-&gt;numPrimType; if ( v4 == (HDDMPrimitive **)hddmPrimitive-&gt;hddmBelDef ) { std::vector&lt;HDDMPrimitive *&gt;::_M_emplace_back_aux&lt;HDDMPrimitive * const&amp;&gt;(hddmPrimitive, &amp;v7); } else { if ( v4 ) { *v4 = v7; v5 = *(_QWORD *)&amp;hddmPrimitive-&gt;numPrimType; } else { v5 = 0LL; } *(_QWORD *)&amp;hddmPrimitive-&gt;numPrimType = v5 + 8; } } __int64 __fastcall HDDMBelDef::allocatepindefs(HDDMBelDef *this, unsigned __int16 nIndex) { __int64 v2; // rbx _QWORD *v3; // rax HDDMBelPinDef *v4; // r14 HDDMBelPinDef *v5; // rbp unsigned int beldef_code_low; // eax __int64 result; // rax v2 = nIndex - 1LL; v3 = (_QWORD *)operator new[](16LL * nIndex + 8); v4 = (HDDMBelPinDef *)(v3 + 1); *v3 = nIndex; v5 = (HDDMBelPinDef *)(v3 + 1); if ( nIndex ) { do { HDDMBelPinDef::HDDMBelPinDef(v5); --v2; ++v5; } while ( v2 != -1 ); } beldef_code_low = LOWORD(this-&gt;beldef_code); this-&gt;hddmBelPinDefArray = v4; LOWORD(beldef_code_low) = beldef_code_low &amp; 0xC000; result = nIndex &amp; 0x3FFF | beldef_code_low; LOWORD(this-&gt;beldef_code) = result; return result; } void __fastcall HDDMBelDef::buildReservedBelTypes(HDDMBelDef *this, HDDMDevice *hddmDevice) { _QWORD *v2; // rax __int64 v3; // rax __int64 Site; // rbx int i; // ebp HDDMElement *Element; // rax __int64 BelDef; // rax _WORD *v8; // rax _QWORD *v9; // [rsp+8h] [rbp-90h] char v10; // [rsp+2Fh] [rbp-69h] BYREF HDDMSite v11; // [rsp+30h] [rbp-68h] BYREF _QWORD v12[9]; // [rsp+50h] [rbp-48h] BYREF v2 = (_QWORD *)operator new(0x18uLL); *v2 = 0LL; v2[1] = 0LL; v2[2] = 0LL; v9 = v2; v3 = (__int64)(this-&gt;field_80 - this-&gt;field_78) &gt;&gt; 3; if ( (_WORD)v3 ) std::vector&lt;unsigned char&gt;::_M_fill_insert(v9, 0LL, (unsigned __int16)v3, &amp;unk_7B5CA98); std::string::string(v12, &quot;CFG_IO_ACCESS&quot;, &amp;v11); sub_2165630(this, v9, v12, 2LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;USR_ACCESS&quot;, &amp;v11); sub_2165630(this, v9, v12, 3LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;EFUSE_USR&quot;, &amp;v11); sub_2165630(this, v9, v12, 3LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;DCIRESET&quot;, &amp;v11); sub_2165630(this, v9, v12, 3LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;ICAP_TOP&quot;, &amp;v11); sub_2165630(this, v9, v12, 4LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;ICAP_BOT&quot;, &amp;v11); sub_2165630(this, v9, v12, 4LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;STARTUP&quot;, &amp;v11); sub_2165630(this, v9, v12, 4LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;FRAME_ECC&quot;, &amp;v11); sub_2165630(this, v9, v12, 4LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); std::string::string(v12, &quot;PS8_X0Y0&quot;, &amp;v11); Site = HDDMDevice::getSite((HDDMDevice *)this, (const std::string *)v12); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v11.qword10); if ( Site ) { for ( i = 0; ; ++i ) { v8 = (_WORD *)(*(_QWORD *)(HDDMDeviceCache::m_devcache[(*(_BYTE *)(Site + 8) &gt;&gt; 2) &amp; 0xF] + 240LL) + 48LL * ((*(_DWORD *)Site &gt;&gt; 2) &amp; 0x3FFFFF)); if ( i &gt;= ((*(_DWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(*(_QWORD *)(HDDMDeviceCache::m_devcache[(*v8 &gt;&gt; 6) &amp; 0xF] + 168LL) + 8LL * (v8[2] &amp; 0x3FF)) + 120LL) + 8LL * *(unsigned __int8 *)(Site + 3)) + 12LL) &gt;&gt; 6) &amp; 0x1FFF) ) break; HDDMSite::getBel(&amp;v11, Site); if ( (unsigned __int8)HDDMBel::isBad((HDDMBel *)&amp;v11) ) { HDDMBel::~HDDMBel((HDDMBel *)&amp;v11); } else { Element = (HDDMElement *)HDDMBel::getElement((HDDMBel *)&amp;v11); BelDef = HDDMElement::getBelDef(Element); std::string::string((std::string *)&amp;v11.qword10, (const std::string *)(BelDef + 16)); if ( !strcmp((const char *)v11.qword10, &quot;PSS_ALTO_CORE&quot;) || !strcmp((const char *)v11.qword10, &quot;PSS_ALTO_CORE_PAD_CLK&quot;) ) { std::string::_Rep::_M_dispose(v11.qword10 - 24LL, v12); HDDMBel::~HDDMBel((HDDMBel *)&amp;v11); } else { std::string::string((std::string *)v12, (const std::string *)&amp;v11.qword10); sub_2165630(this, v9, v12, 1LL); std::string::_Rep::_M_dispose(v12[0] - 24LL, &amp;v10); std::string::_Rep::_M_dispose(v11.qword10 - 24LL, v12); HDDMBel::~HDDMBel((HDDMBel *)&amp;v11); } } } } } void __fastcall HDDMBelDef::createpindefsmap(HDDMBelDef *this) { __int64 v1; // rax HDDMBelPinDef *v2; // r12 _QWORD *v3; // r14 _QWORD *pindef_name; // rbx __int64 v5; // rbp size_t v6; // r13 int v7; // eax _QWORD *v8; // rdi size_t v9; // r15 size_t v10; // rdx _QWORD *v11; // rsi size_t v12; // rdx int v13; // eax unsigned __int16 v14; // [rsp+6h] [rbp-82h] __int64 v15; // [rsp+8h] [rbp-80h] size_t v16; // [rsp+8h] [rbp-80h] __int64 qword30; // [rsp+10h] [rbp-78h] char v19; // [rsp+3Fh] [rbp-49h] BYREF _QWORD *p_pindef_name; // [rsp+40h] [rbp-48h] BYREF v1 = operator new(0x30uLL); *(_DWORD *)(v1 + 8) = 0; *(_QWORD *)(v1 + 16) = 0LL; *(_QWORD *)(v1 + 40) = 0LL; qword30 = v1; *(_QWORD *)(v1 + 24) = v1 + 8; *(_QWORD *)(v1 + 32) = v1 + 8; this-&gt;qword30 = v1; v15 = v1 + 8; v14 = 0; if ( (this-&gt;beldef_code &amp; 0x3FFF) == 0 ) return; while ( 2 ) { v2 = &amp;this-&gt;hddmBelPinDefArray[v14]; v3 = *(_QWORD **)(qword30 + 16); if ( !v3 ) { v5 = v15; goto LABEL_24; } pindef_name = (_QWORD *)v2-&gt;pindef_name; v5 = v15; v6 = *(pindef_name - 3); do { while ( 1 ) { v8 = (_QWORD *)v3[4]; v9 = *(v8 - 3); v10 = v9; if ( v6 &lt;= v9 ) v10 = v6; v7 = memcmp(v8, pindef_name, v10); if ( !v7 ) break; LABEL_5: if ( v7 &lt; 0 ) goto LABEL_12; LABEL_6: v5 = (__int64)v3; v3 = (_QWORD *)v3[2]; if ( !v3 ) goto LABEL_13; } if ( (__int64)(v9 - v6) &gt; 0x7FFFFFFF ) goto LABEL_6; if ( (__int64)(v9 - v6) &gt;= (__int64)0xFFFFFFFF80000000LL ) { v7 = v9 - v6; goto LABEL_5; } LABEL_12: v3 = (_QWORD *)v3[3]; } while ( v3 ); LABEL_13: if ( v15 == v5 ) goto LABEL_24; v11 = *(_QWORD **)(v5 + 32); v12 = *(v11 - 3); v16 = v12; if ( v6 &lt;= v12 ) v12 = v6; v13 = memcmp(pindef_name, v11, v12); if ( v13 ) { LABEL_20: if ( v13 &lt; 0 ) goto LABEL_24; } else if ( (__int64)(v6 - v16) &lt;= 0x7FFFFFFF ) { if ( (__int64)(v6 - v16) &gt;= (__int64)0xFFFFFFFF80000000LL ) { v13 = v6 - v16; goto LABEL_20; } LABEL_24: p_pindef_name = &amp;v2-&gt;pindef_name; v5 = std::_Rb_tree&lt;std::string,std::pair&lt;std::string const,HDDMBelPinDef *&gt;,std::_Select1st&lt;std::pair&lt;std::string const,HDDMBelPinDef *&gt;&gt;,std::less&lt;std::string&gt;,std::allocator&lt;std::pair&lt;std::string const,HDDMBelPinDef *&gt;&gt;&gt;::_M_emplace_hint_unique&lt;std::piecewise_construct_t const&amp;,std::tuple&lt;std::string const&amp;&gt;,std::tuple&lt;&gt;&gt;( qword30, v5, &amp;unk_7B5CA99, &amp;p_pindef_name, &amp;v19); } *(_QWORD *)(v5 + 40) = v2; if ( ++v14 &lt; (this-&gt;beldef_code &amp; 0x3FFF) ) { qword30 = this-&gt;qword30; v15 = qword30 + 8; continue; } break; } } 请 __int64 ushortVec 映射为 std::vector &lt;uint16_t&gt; ushortVec void __fastcall HDDMBelDef::getDrivenPins(HDDMBelDef *this, __int64 ushortVec, unsigned __int16 nIndex) { __int64 qword20; // rax int v6; // esi unsigned __int16 v7; // di int v8; // r13d __int64 v9; // rbx __int64 v10; // r14 _WORD *v11; // rcx __int16 v12; // ax bool v13; // zf __int64 v14; // rax _WORD v15[36]; // [rsp+0h] [rbp-48h] BYREF qword20 = this-&gt;pipsMatrixVec; if ( qword20 ) { v6 = this-&gt;beldef_code &gt;&gt; 14; v7 = (this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF; v8 = (unsigned __int16)((this-&gt;beldef_code &amp; 0x3FFF) - ((v6 &amp; 0x3FFF) + v7)) + v7; if ( v8 ) { v9 = 0LL; v10 = 8LL * nIndex; while ( 1 ) { if ( !*(_BYTE *)(*(_QWORD *)(qword20 + v10) + v9) ) goto LABEL_4; v11 = *(_WORD **)(ushortVec + 8); v12 = v9 + ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF); v13 = v11 == *(_WORD **)(ushortVec + 16); v15[0] = v12; if ( v13 ) break; if ( v11 ) { *v11 = v12; v14 = *(_QWORD *)(ushortVec + 8); } else { v14 = 0LL; } ++v9; *(_QWORD *)(ushortVec + 8) = v14 + 2; if ( v8 &lt;= (int)v9 ) return; LABEL_5: qword20 = this-&gt;pipsMatrixVec; } std::vector&lt;unsigned short&gt;::_M_emplace_back_aux&lt;unsigned short&gt;(ushortVec, v15); LABEL_4: if ( v8 &lt;= (int)++v9 ) return; goto LABEL_5; } } } void __fastcall HDDMBelDef::getDrivingPins(HDDMBelDef *this, __int64 ushortVec, unsigned __int16 nIndex) { __int64 qword20; // rax unsigned __int16 v4; // r8 int v5; // r14d int v6; // r13d __int64 v7; // rbx _WORD *v8; // rax bool v9; // zf __int64 v10; // rax _WORD v11[36]; // [rsp+0h] [rbp-48h] BYREF qword20 = this-&gt;pipsMatrixVec; if ( qword20 ) { v4 = (this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF; v5 = nIndex - ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF); v6 = v4 + (unsigned __int16)((this-&gt;beldef_code &amp; 0x3FFF) - (((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF) + v4)); if ( v6 ) { v7 = 0LL; while ( 1 ) { if ( !*(_BYTE *)(*(_QWORD *)(qword20 + 8 * v7) + v5) ) goto LABEL_4; v8 = *(_WORD **)(ushortVec + 8); v9 = v8 == *(_WORD **)(ushortVec + 16); v11[0] = v7; if ( v9 ) break; if ( v8 ) { *v8 = v7; v10 = *(_QWORD *)(ushortVec + 8); } else { v10 = 0LL; } ++v7; *(_QWORD *)(ushortVec + 8) = v10 + 2; if ( v6 &lt;= (int)v7 ) return; LABEL_5: qword20 = this-&gt;pipsMatrixVec; } std::vector&lt;unsigned short&gt;::_M_emplace_back_aux&lt;unsigned short&gt;(ushortVec, v11); LABEL_4: if ( v6 &lt;= (int)++v7 ) return; goto LABEL_5; } } } void __fastcall HDDMBelDef::getNextDrivenPin(HDDMBelDef *this, unsigned __int16 a2, int index) { __int64 qword20; // r8 unsigned __int16 v4; // cx __int16 v5; // r9 unsigned __int16 v6; // di __int16 v7; // dx __int64 v8; // rdx qword20 = this-&gt;pipsMatrixVec; if ( qword20 ) { v4 = 0; v5 = (this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF; v6 = (this-&gt;beldef_code &amp; 0x3FFF) - v5; v7 = index - v5 + 1; if ( v7 &gt;= 0 ) v4 = v7; if ( v6 &gt; v4 ) { v8 = *(_QWORD *)(qword20 + 8LL * a2); if ( !*(_BYTE *)(v8 + v4) ) { do ++v4; while ( v6 &gt; v4 &amp;&amp; !*(_BYTE *)(v8 + v4) ); } } } } void __fastcall HDDMBelDef::getNextDrivingPin(HDDMBelDef *this, __int16 a2, unsigned int index) { __int64 qword20; // r9 unsigned __int16 v4; // si unsigned __int16 v5; // r8 unsigned __int16 v6; // cx __int16 v7; // dx qword20 = this-&gt;pipsMatrixVec; if ( qword20 ) { v4 = a2 - ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF); v5 = (this-&gt;beldef_code &amp; 0x3FFF) - ((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF); v6 = 0; v7 = index + 1; if ( v7 &gt;= 0 ) v6 = v7; for ( ; v5 &gt; v6 &amp;&amp; !*(_BYTE *)(*(_QWORD *)(qword20 + 8LL * v6) + v4); ++v6 ) ; } } __int64 __fastcall HDDMBelDef::getNumArcs(HDDMBelDef *this, unsigned __int16 a2) { int v2; // eax int NumFwdArcs; // r12d v2 = *(_BYTE *)(HDDMBelDef::getPinDef(this, a2) + 7) &amp; 0xC0; if ( !v2 ) return HDDMBelDef::getNumFwdArcs(this, a2); if ( (_BYTE)v2 == 0x80 ) return HDDMBelDef::getNumReverseArcs(this, a2); NumFwdArcs = HDDMBelDef::getNumFwdArcs(this, a2); return NumFwdArcs + (unsigned int)HDDMBelDef::getNumReverseArcs(this, a2); } __int64 __fastcall HDDMBelDef::getNumFwdArcs(HDDMBelDef *this, unsigned __int16 a2) { __int64 qword20; // rcx unsigned __int16 v3; // r9 int v4; // eax int v5; // edi __int64 v6; // rdx __int64 result; // rax __int64 v8; // rsi qword20 = this-&gt;pipsMatrixVec; if ( !qword20 ) return 0LL; v3 = (this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF; v4 = (unsigned __int16)((this-&gt;beldef_code &amp; 0x3FFF) - (((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF) + v3)); v5 = v4 + ((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF); if ( !(v4 + v3) ) return 0LL; v6 = 0LL; result = 0LL; v8 = *(_QWORD *)(qword20 + 8LL * a2); do { if ( *(_BYTE *)(v8 + v6) ) result = (unsigned int)(result + 1); ++v6; } while ( v5 &gt; (int)v6 ); return result; } __int64 __fastcall HDDMBelDef::getNumPips(HDDMBelDef *this) { __int64 qword20; // r9 int v2; // eax int v3; // r10d int v4; // esi __int64 v5; // r8 __int64 result; // rax __int64 v7; // rdx qword20 = this-&gt;pipsMatrixVec; if ( !qword20 ) return 0LL; v2 = (unsigned __int16)((this-&gt;beldef_code &amp; 0x3FFF) - (((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF) + ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF))); v3 = v2 + ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF); v4 = v2 + ((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF); if ( !v3 ) return 0LL; v5 = 0LL; result = 0LL; do { if ( v4 ) { v7 = 0LL; do { if ( *(_BYTE *)(*(_QWORD *)(qword20 + 8 * v5) + v7) ) result = (unsigned int)(result + 1); ++v7; } while ( v4 &gt; (int)v7 ); } ++v5; } while ( v3 &gt; (int)v5 ); return result; } __int64 __fastcall HDDMBelDef::getNumReverseArcs(HDDMBelDef *this, __int16 a2) { __int64 qword20; // r8 unsigned __int16 v3; // dx unsigned __int16 v4; // si int v5; // r9d __int64 v6; // rdx __int64 result; // rax qword20 = this-&gt;pipsMatrixVec; if ( !qword20 ) return 0LL; v3 = (this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF; v4 = a2 - v3; v5 = (unsigned __int16)((this-&gt;beldef_code &amp; 0x3FFF) - (((this-&gt;beldef_code1 &gt;&gt; 4) &amp; 0x3FFF) + v3)) + v3; if ( !v5 ) return 0LL; v6 = 0LL; result = 0LL; do { if ( *(_BYTE *)(*(_QWORD *)(qword20 + 8 * v6) + v4) ) result = (unsigned int)(result + 1); ++v6; } while ( v5 &gt; (int)v6 ); return result; } __int64 __fastcall HDDMBelDef::getPinByName(HDDMBelDef *this, const void **a2) { __int64 qword30; // rax _QWORD *v3; // rbx _QWORD *v4; // r14 const void *v5; // r12 _QWORD *v6; // r13 size_t v7; // r15 int v8; // eax _QWORD *v9; // rdi size_t v10; // rdx size_t v11; // rbp __int64 v12; // rbp _QWORD *v13; // rsi size_t v14; // rdx size_t v15; // rbx int v16; // eax __int64 v17; // r15 __int64 result; // rax qword30 = this-&gt;qword30; v3 = *(_QWORD **)(qword30 + 16); v4 = (_QWORD *)(qword30 + 8); if ( !v3 ) return 0LL; v5 = *a2; v6 = (_QWORD *)(qword30 + 8); v7 = *((_QWORD *)*a2 - 3); do { while ( 1 ) { v9 = (_QWORD *)v3[4]; v10 = v7; v11 = *(v9 - 3); if ( v11 &lt;= v7 ) v10 = *(v9 - 3); v8 = memcmp(v9, v5, v10); if ( !v8 ) break; LABEL_4: if ( v8 &lt; 0 ) goto LABEL_11; LABEL_5: v6 = v3; v3 = (_QWORD *)v3[2]; if ( !v3 ) goto LABEL_12; } v12 = v11 - v7; if ( v12 &gt; 0x7FFFFFFF ) goto LABEL_5; if ( v12 &gt;= (__int64)0xFFFFFFFF80000000LL ) { v8 = v12; goto LABEL_4; } LABEL_11: v3 = (_QWORD *)v3[3]; } while ( v3 ); LABEL_12: if ( v4 == v6 ) return 0LL; v13 = (_QWORD *)v6[4]; v14 = v7; v15 = *(v13 - 3); if ( v15 &lt;= v7 ) v14 = *(v13 - 3); v16 = memcmp(v5, v13, v14); if ( v16 ) { LABEL_21: if ( v16 &gt;= 0 ) return v6[5]; return 0LL; } v17 = v7 - v15; if ( v17 &gt; 0x7FFFFFFF ) return v6[5]; result = 0LL; if ( v17 &gt;= (__int64)0xFFFFFFFF80000000LL ) { v16 = v17; goto LABEL_21; } return result; } __int64 __fastcall HDDMBelDef::getRouteThruSettings(HDDMBelDef *this, unsigned int a2, int a3, __int64 **a4) { __int64 result; // rax int v6; // r8d unsigned __int16 v7; // r14 __int64 *v8; // rbp __int64 *v9; // r12 __int64 *v10; // r9 _BYTE *v11; // r11 __int64 v12; // rsi void *v13; // rdi __int64 qword20; // r9 __int64 qword48; // rsi _QWORD *p_char40; // rdi __int64 *v17; // r14 __int64 v18; // rax __int64 v19; // rax void *v20; // rdi int v21; // edx int v22; // edx _BYTE *v23; // [rsp+8h] [rbp-70h] _BYTE *v24; // [rsp+8h] [rbp-70h] __int64 *v25; // [rsp+10h] [rbp-68h] __int64 *v26; // [rsp+10h] [rbp-68h] unsigned int v27; // [rsp+1Ch] [rbp-5Ch] unsigned int v28; // [rsp+1Ch] [rbp-5Ch] int v29; // [rsp+20h] [rbp-58h] int v30; // [rsp+20h] [rbp-58h] __int16 v31; // [rsp+20h] [rbp-58h] int v32; // [rsp+24h] [rbp-54h] int v33; // [rsp+24h] [rbp-54h] __int16 v34; // [rsp+24h] [rbp-54h] __int64 **v35; // [rsp+28h] [rbp-50h] __int64 **v36; // [rsp+28h] [rbp-50h] __int64 **v37; // [rsp+28h] [rbp-50h] _BYTE v38[57]; // [rsp+3Fh] [rbp-39h] BYREF result = a2; v6 = a3; v7 = a2; v8 = *a4; v9 = a4[1]; if ( *a4 != v9 ) { v10 = *a4; if ( &amp;_pthread_key_create ) { v11 = v38; do { v12 = v10[1]; if ( (_UNKNOWN *)(v12 - 24) != &amp;std::string::_Rep::_S_empty_rep_storage &amp;&amp; _InterlockedExchangeAdd((volatile signed __int32 *)(v12 - 8), 0xFFFFFFFF) &lt;= 0 ) { v35 = a4; v32 = a3; v29 = v6; v27 = result; v25 = v10; v23 = v11; std::string::_Rep::_M_destroy(v12 - 24, v11); a4 = v35; a3 = v32; v6 = v29; result = v27; v10 = v25; v11 = v23; } v13 = (void *)(*v10 - 24); if ( v13 != &amp;std::string::_Rep::_S_empty_rep_storage &amp;&amp; _InterlockedExchangeAdd((volatile signed __int32 *)(*v10 - 8), 0xFFFFFFFF) &lt;= 0 ) { v36 = a4; v33 = a3; v30 = v6; v28 = result; v26 = v10; v24 = v11; std::string::_Rep::_M_destroy(v13, v11); a4 = v36; a3 = v33; v6 = v30; result = v28; v10 = v26; v11 = v24; } v10 += 2; } while ( v9 != v10 ); } else { v17 = *a4; v31 = a3; v34 = a3; v37 = a4; do { v18 = v17[1]; if ( (_UNKNOWN *)(v18 - 24) != &amp;std::string::_Rep::_S_empty_rep_storage ) { v21 = *(_DWORD *)(v18 - 8); *(_DWORD *)(v18 - 8) = v21 - 1; if ( v21 &lt;= 0 ) std::string::_Rep::_M_destroy(v18 - 24, v38); } v19 = *v17; v20 = (void *)(*v17 - 24); if ( v20 != &amp;std::string::_Rep::_S_empty_rep_storage ) { v22 = *(_DWORD *)(v19 - 8); *(_DWORD *)(v19 - 8) = v22 - 1; if ( v22 &lt;= 0 ) std::string::_Rep::_M_destroy(v20, v38); } v17 += 2; } while ( v9 != v17 ); v7 = a2; result = a2; LOWORD(v6) = v31; LOWORD(a3) = v34; a4 = v37; } } a4[1] = v8; qword20 = this-&gt;pipsMatrixVec; if ( qword20 ) { if ( *(_BYTE *)(*(_QWORD *)(qword20 + 8LL * v7) + (unsigned __int16)a3 - ((this-&gt;beldef_code &gt;&gt; 14) &amp; 0x3FFF)) ) { qword48 = this-&gt;qword48; if ( qword48 ) { p_char40 = &amp;this-&gt;char40; do { while ( v7 &lt;= *(_WORD *)(qword48 + 32) &amp;&amp; (v7 &lt; *(_WORD *)(qword48 + 32) || (unsigned __int16)v6 &lt;= *(_WORD *)(qword48 + 34)) ) { p_char40 = (_QWORD *)qword48; qword48 = *(_QWORD *)(qword48 + 16); if ( !qword48 ) goto LABEL_17; } qword48 = *(_QWORD *)(qword48 + 24); } while ( qword48 ); LABEL_17: if ( &amp;this-&gt;char40 != p_char40 &amp;&amp; (unsigned __int16)result &gt;= *((_WORD *)p_char40 + 16) &amp;&amp; ((unsigned __int16)result &gt; *((_WORD *)p_char40 + 16) || (unsigned __int16)a3 &gt;= *((_WORD *)p_char40 + 17)) ) { return std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt;::_M_assign_aux&lt;__gnu_cxx::__normal_iterator&lt;std::pair&lt;std::string,std::string&gt;*,std::vector&lt;std::pair&lt;std::string,std::string&gt;&gt;&gt;&gt;( a4, *(_QWORD *)p_char40[5], *(_QWORD *)(p_char40[5] + 8LL)); } } } } return result; } __int64 __fastcall HDDMBelDef::setrecursivedeviceid(HDDMBelDef *this, unsigned __int16 a2) { __int64 v2; // rdx int v3; // r9d int v4; // ecx __int64 result; // rax char v6; // r9 bool v7; // zf HDDMBelUsageDef *hddmBelUsageDef; // rdi v2 = 0LL; v3 = a2 &amp; 0xF; v4 = 0; result = v3 | this-&gt;beldef_code1 &amp; 0xF0u; v6 = 16 * v3; v7 = (this-&gt;beldef_code &amp; 0x3FFF) == 0; LOBYTE(this-&gt;beldef_code1) = result; if ( !v7 ) { do { ++v4; BYTE2(this-&gt;hddmBelPinDefArray[v2].pindef_code) = v6 | BYTE2(this-&gt;hddmBelPinDefArray[v2].pindef_code) &amp; 0xF; ++v2; result = this-&gt;beldef_code &amp; 0x3FFF; } while ( (int)result &gt; v4 ); } hddmBelUsageDef = this-&gt;hddmBelUsageDef; if ( hddmBelUsageDef ) return HDDMBelUsageDef::setrecursivedeviceid(hddmBelUsageDef, a2); return result; }
最新发布
10-25
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值