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. IOS内存管理「2」- 点语法的内存管理

  2. bootstrap API地址

    http://wenzhixin.net.cn/p/bootstrap-table/docs/examples.html#pagination-table

  3. 利用FormsAuthentication.RedirectFromLoginPage进行身份验证

    web.config中: <authentication>节 格式: <authentication mode="Forms">    //I.Window ...

  4. Matlab 支持向量机(SVM)实现多分类

    1.首先,你需要安装完成Matlab. 2.将libsvm-3.17.zip和drtoolbox.tar文件解压到:libsvm-3.17文件夹和drtoolbox,并放到MATLAB的工具箱安装目录 ...

  5. java获取常见文本文件的编码 解决乱码问题

    乱码问题的产生一般是,由字节流转字符流的时候,读文件的编码与文件的系统编码不一致造成的. 解决方式:先自动判断文件系统编码类型,然后读的时候用这个类型去读就ok了. 自动判断文件系统编码类型代码如下, ...

  6. jQuery图片无缝轮播插件;

    图片轮播这种效果在web开发中看常见,网上的插件也有很多,最近在整理项目的过程中,把之前的图片轮播效果整合了一下,整理成一个可调用的插件以做记录,也方便更多前端爱好者来学习使用:图片的轮播原理很简单, ...

  7. 【环境】VS2013和MATLAB相互调用混合编程

    Visual Studio和MATLAB混合编程,有两种方法: 1 MATLAB调用C程序: 2 VS调用MATLAB(目前见到的都是VS,其他编译器如codeblocks,或不提供这项功能): 前一 ...

  8. c++ swap 函数

    转载地址 1,最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符. template <class T> void swap ( T& a, T& b ) { T ...

  9. UVALive - 6572 Shopping Malls floyd

    题目链接: http://acm.hust.edu.cn/vjudge/problem/48416 Shopping Malls Time Limit: 3000MS 问题描述 We want to ...

  10. Segment Tree 分类: ACM TYPE 2014-08-29 13:04 97人阅读 评论(0) 收藏

    #include<iostream> #include<cstdio> using namespace std; struct node { int l, r, m; int ...