zoukankan      html  css  js  c++  java
  • 《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容器插入元素并且建立双向链接。个人理解。

  • 相关阅读:
    对cross-env的理解
    【好好学习】mh_h5
    QS工具入门
    vue中用qs传参发送axios请求
    Web API 异常处理
    WEB API Filter的使用以及执行顺序
    RSA/SHA1加密和数字签名算法在开放平台中的应用
    windows上RSA密钥生成和使用
    Cordova Error: cmd: Command failed with exit code ENOENT
    Cordova热更新cordova-hot-code-push
  • 原文地址:https://www.cnblogs.com/zhong-dev/p/4044583.html
Copyright © 2011-2022 走看看