1 各种迭代器erase实现

析构的基本工具

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

pointer->~T();

}

1.1 vector

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

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

iterator erase(iterator position){

if(position+1!=end())

copy(position+1,finish,postion);

--finish;

destroy(finish);

return position;

}

1.2 list

list是一个双向链表,erase(it)后,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

//deque的erase类似于vector的,erase(it)后,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已经时效(vector和deque还可以使用,但是最好不要这样使用)

4 参考文献

《STL源码剖析》

STL erase函数的更多相关文章

  1. 【C/C++开发】STL erase()函数使用要小心

    http://blog.sina.com.cn/s/blog_67b6b720010114d3.html erase()函数的功能是用来删除容器中的元素 删除某个容器里的某个元素:c.erase(T) ...

  2. 正确使用stl vecotr erase函数

    erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素. 返回值是指向删除的最后一个元素的下一位置的迭代器 Parameters All parameters ar ...

  3. STL中使用reverse_iterator时,如何正确使用erase函数

    假设有一个list容器,顺序存储了0-9一个10个整数.现在要使用reverse_iterator迭代器来查找值为8和5的元素,并且将这两个数删除.先来看以下的解决方法: #include <i ...

  4. STL的erase函数和lower_bound

    前提摘要: [1]一般我们的区间是左闭右开,如下面例子2. [2]erase函数谨慎使用. [3]map也是有序保存的. [erase] 1,删除字符串的首字母: string s="ecu ...

  5. map 和 vector 的erase函数说明

    1. map的erase函数使用 这里首先要注意,C++针对map的erase函数有不同的函数原型,这往往是出现问题的关键所在.根据参考文献1: 在C++98中: (1) void erase (it ...

  6. C++ - 容器(container)的erase()函数

    容器(container)的erase()函数 本文地址: http://blog.csdn.net/caroline_wendy/article/details/23996013 容器(contai ...

  7. C++中string中的erase函数怎么使用

    erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator p ...

  8. c++中string.erase()函数的用法(转)

    erase函数的原型如下:(1)string& erase ( size_t pos = 0, size_t n = npos );(2)iterator erase ( iterator p ...

  9. 在容器中使用erase函数,迭代器的处理

    在c++编程中,用到迭代器的时候,往往不知道如何删除当前迭代器指向的元素. erase函数:   返回下一个迭代器. 只使用vector的erase函数,记住,该函数是迭代器失效,返回下一个迭代器. ...

随机推荐

  1. [转]Reed Solomon纠删码

    [转]Reed Solomon纠删码    http://peterylh.blog.163.com/blog/static/12033201371375050233/     纠删码是存储领域常用的 ...

  2. TList,TObjectList 使用——资源释放

    TOjectList = Class (Tlist); TOjectList继承Tlist,从名字上看就可以知道它是专门为对象列表制作的,那么他到底丰富了那些功能呢? 首先是 TObject 作为对象 ...

  3. Convert Sorted Array to Binary Search Tree

    Convert Sorted Array to Binary Search Tree Given an array where elements are sorted in ascending ord ...

  4. Crawling is going on - Alpha版本使用说明

    [Crawling is going on - Alpha版本] 使 用 说 明 北京航空航天大学计算机学院 远航1617 小组 产品版本:   Alpha版本 产品名称:Crawling   is ...

  5. 【Construct Binary Tree from Inorder and Postorder Traversal】cpp

    题目: Given inorder and postorder traversal of a tree, construct the binary tree. Note:You may assume ...

  6. Mysql 慢查询设置

    Mysql慢查询设置 分析MySQL语句查询性能的方法除了使用 EXPLAIN 输出执行计划,还可以让MySQL记录下查询超过指定时间的语句,我们将超过指定时间的SQL语句查询称为“慢查询”. === ...

  7. Spring与apache CXF结合实例

    本文的前提是已经有一个Spring的项目,在此基础上如何跟apache CXF进行结合,开发出WebService服务和调用WebService服务. 1.开发WebService   1.引入jar ...

  8. bzoj 2599 数分治 点剖分

    具体可以见漆子超的论文 /**************************************************************     Problem:     User: B ...

  9. 【BZOJ】【2565】最长双回文串

    Manacher算法 找出一个最长子串S=X+Y,且X和Y都是回文串,求最长的长度是多少…… 同时找两个串明显很难搞啊……但是我们可以先找到所有的回文串!在找回文串的同时我们可以预处理出来l[i]和r ...

  10. CSS中的视觉格式化模型

    视觉格式化模型 1. 简介 在视觉格式化模型中,文档树中的每个元素都将会根据盒模型产生零到多个盒子.这些盒子的布局由如下因素决定: 盒子的尺寸和类型 定位策略(正常文档流,浮动或者绝对定位) 和文档树 ...