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. UITextField swift

    // // ViewController.swift // UILabelTest // // Created by mac on 15/6/23. // Copyright (c) 2015年 fa ...

  2. 四则运算三+psp0级表格

    一.题目 在四则运算二的基础上,选择一个方向进行拓展,我选择的是增加了答题模块 二.设计思路 1.在上次的基础上,增加了答题模块,每出现一道四则运算题目,便提醒输入结果,如果结果错误,就会提示错误 2 ...

  3. 水王ID

    题目: 三人行设计了一个灌水论坛.信息学院的学生都喜欢在上面交流灌水,传说在论坛上有一个“水王”,他不但喜欢发帖,还会回复其他ID发的每个帖子.坊间风闻该“水王”发帖数目超过了帖子数目的一半. 如果你 ...

  4. 每日会议<第二天>

    昨天:看android编程教学视频 今天:看了老师给的学姐.学长软件的代码,找到他们的优缺点,取长补短 困难:创新意识少,提不出建设性意见,缺少自己的思想

  5. camera render texture 游戏里的监控视角

    Camera里: 新建render texture并拖入到target texture里 新建材质球 拖入render texture      camera里的视角会在材质球上出现  新建一个pla ...

  6. Careercup - Microsoft面试题 - 6282862240202752

    2014-05-11 03:56 题目链接 原题: Given an integer array. Perform circular right shift by n. Give the best s ...

  7. 如何实现SAP的RFC函数调用(原创)

    连接sap系统需要通过sap javaconnect来连接,对于sapjco.jar系列文件有32位与64位之分[32位用的JAR版本是 2.1.10 (2011-05-10) ,64位用的JAR版本 ...

  8. IIS8中 出现ashx 401:未授权,uploadify上传文件失败

    环境:阿里云服务器 windows2012  + IIS8 +asp.net 访问IIS 出现能正常访问aspx页面,但是通过ajax访问ashx上传文件的时候就出现ashx  Status Code ...

  9. sql数据库的表连接方式图文详解

    sql数据库表连接,主要分为:内连接.外连接(左连接.右连接 .全连接).交叉连接,今天统一整合一下,看看他们的区别.   首先建表填充值. 学生表:student(id,姓名,年龄,性别 ) 成绩表 ...

  10. angular 嵌套实现树结构 ng-repeat ng-include

    效果图 ang.html <!doctype html><html lang="en"><head>    <meta charset=& ...