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. 21.altera fpga 芯片中 pin 和 pad 区别

    在chip planner 中 ,看管脚时,会看到 pin 和pad 同时出现, 如 pin120/pad174 Bank 4 那么有什么区别? PIN指芯片封装好后的管脚,即用户看到的管脚: PAD ...

  2. Android -- Home按键

    游戏中常常需要监听android HOME键,当HOME键下压时,往往需要做一些状态保存,音效停止等操作,那么如何做,才能监听到HOME键呢?我们知道HOME是系统键,app中无法通过onKey这些函 ...

  3. Notes of the scrum meeting(12.8)

    meeting time:18:00~18:30p.m.,December 8th,2013 meeting place:20号公寓前 attendees: 顾育豪                   ...

  4. 修改ptrace_scope

    需要将kernel.yama.ptrace_scope=1 改为kernel.yama.ptrace_scope=0 文件位于/etc/sysctl.d/目录下 修改后需要用sysctl -p /et ...

  5. 拓展Jquery对象,实现Post提交并跳转

    $.extend({ StandardPost:function(url,args){ var body = $(document.body), form = $("<form met ...

  6. HTML5表单学习笔记

    表单在网页设计中的作用非常重要,HTML5又增加了表单方面的诸多功能,包括增加input输入类型,input属性,form元素,form属性等,解决了我们以前比较头疼或者繁琐的功能. 新增的输入类型 ...

  7. selenium使用IE 浏览器问题

    代码如下: #coding=utf-8 from selenium import webdriver driver=webdriver.Ie() driver.get('https://www.bai ...

  8. Oracle创建表时涉及的参数解析

    1.oracle pctfree和pctused详解   http://www.cnblogs.com/linjiqin/archive/2012/01/16/2323320.html http:// ...

  9. File "/struts-tags" not found

    前言 由于在某个jsp引用了struts标签库,导致该错误产生--这是stuts项目算是一道经典错误,往往最后的解决方式是更换Tomcat.今天我记录的是引起这一错误的一个非常隐藏的原因. 错误描述 ...

  10. samba 常见问题

    今天帮一个朋友搭建samba服务器,发现总是无法正常访问,最后google+摸索搞定了,下面把遇到的问题和解决方法共享一下. 这里用的linux是centos版本6. 一开始遇到的问题是‘找不到网络路 ...