《STL源码剖析》---list容器insert操作的个人理解

       最近在看STL源码剖析,感觉还是挺深奥的,感觉看不太懂。今天在看list容器这块,讲到了insert操作,便记录一番自己的理解吧。
       摘抄书上的:
 iterator insert (iterator position,const T& x)
{
     link_type tmp = create_node(x); //产生一个节点(初始化内容为x)
     //调整双向指标,使tmp安插进去
     tmp->next = position.node;
     tmp->prev = position.node->prev;
     (link_type(position.node->prev))->next = tmp;
     position.node->prev = tmp;
     return tmp;
}

        一开始看这个一直看不懂,因为之前学C++的时候,list容器没怎么掌握,现在的话对其具体的认识还是不够的,只是例如:push_back()等操作知道是干什么。这个insert操作里面的东西一开始不清楚,后来仔细理解了一番不知道是不是对的。

1.

create_node(x);    //<span style="font-size: 18px; font-family: Arial;">创建一个新的节点这个知道。</span>
2.
tmp->next = position.node;
position.node->prev = tmp;

       这里我的理解是,因为list是双向的。在position的位置插入元素x,现在创建了一个新的节点tmp,其data为x,要实现双向,首先该新节点要链接到下一个节点。因为是在position的位置插入新的元素,因此这个新节点的下一个节点自然而然就是position这个节点,所以:

tmp->next = position.node;

       以上操作就是建立tmp与position的链接;然后实现双向,则position的前一个节点需为tmp,所以:

position.node->prev = tmp;

       以上操作就使得tmp与position这个位置的节点之间建立了双向链接;

3.

       然后就是要实现tmp与position位置节点原来的前一个节点直接实现双向链接,因此就需要:

tmp->prev = position.node->prev; 
(link_type(position.node->prev))->next = tmp;
       首先第一步,position位置节点原来指向的前一个节点,现在转变为tmp指向的前一个,所以:
tmp->prev = position.node->pref;
       这样就实现了tmp与前一个节点的单向链接;第二步,position位置节点原来的那个节点与tmp的链接,所以:
(link_type(position.node->prev))->next = tmp;
       得到其原先的前一个节点:link_type(position.node->pref),然后该节点的next指向tmp。


       以上便实现了list容器插入元素并且建立双向链接。个人理解。

原文地址:https://www.cnblogs.com/zhong-dev/p/4044583.html