《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容器插入元素并且建立双向链接。个人理解。