• STL erase函数


    各种迭代器erase实现

    析构的基本工具

    Template <class T> inline void destroy(T* pointer){

    pointer->~T();

    }

    1.1 vector

    vector是连续的线性空间,是可以成长的,但是成长过程是(1)另觅更大空间,(2)将原数据复制过去;(3)释放原空间(每次成长为原来的2倍,虽然对成长做了未雨绸缪,但是成长的代价是比较大的,因此使用vector时最好根据实际情况resize欲分配一个大小)。

    //把后面的元素往前移动,释放掉最后一个元素,eraseit)后,it还可以使用,it不变,但是里面的元素已经是下一个

    iterator erase(iterator position){

    if(position+1!=end())

    copy(position+1,finish,postion);

    --finish;

    destroy(finish);

    return position;

    }

    1.2 list

    list是一个双向链表,eraseit)后,it已经被释放,无效

    iterator erase(iterator position) {

        link_type next_node = link_type(position.node->next);

        link_type prev_node = link_type(position.node->prev);

        prev_node->next = next_node;

        next_node->prev = prev_node;

        destroy_node(position.node); //销毁(析构并释放)一个节点

        return iterator(next_node);

    }

    //销毁(析构并释放)一个节点

    void destroy_node(link_type p){

    destroy(&p->data);

    put_node(p);//释放一个节点

    }

    1.3 deque

    //dequeerase类似于vector的,eraseit)后,it还可以使用,it不变,里面的元素已经是下一个,但是进行了优化,如果删除前面的元素少,前面的元素往后移动,释放首空间;如果删除后面的元素少,后面的元素往前移动,释放掉最后的空间,源码如下:

    iterator erase(iterator pos){

    iterator next=pos;

    ++next;

    difference_type index = pos-start;   //清除点之前的元素个数

    if(index<(size()>>1)){            //如果清除点之前的元素比较少

    copy_backward(start,pos,next); //就移动清除点之前的元素

    pop_front();                //移动完毕,最前面一个元素冗余,去除之

    }

    esle{                      //清除点之后的元素比较少

    copy(next,finishi,pos);        //就移动清除点之后的元素

    pop_back();                 //移动完毕,最后面一个元素冗余,去除之

    }

    return start+index;

    }

     

    2 erase的正确使用方法

    it=a.erase(it);//根据实现就可以看出

    a.erase(it++);//先保存临时变量,然后删除

    3 erase的错误使用方法

    a.erase(++it);或者a.erase(it);//先删除后使用,it已经时效(vectordeque还可以使用,但是最好不要这样使用)

    参考文献

    STL源码剖析》

    转载请注明出处 jacksu
    开源文档:  redis源码解析
    开源库:  github链接
    个人小站:  jack's blog
  • 相关阅读:
    照片墙效果一多实例演示【已封装】
    把javascript event事件封装了下,兼容大多数浏览器
    catch error
    call tcl from c
    scrollbar
    sharedlibextension
    treectrl
    get file name part
    namespace eval
    glob
  • 原文地址:https://www.cnblogs.com/jacksu-tencent/p/3358275.html
Copyright © 2020-2023  润新知