开发成长之路(4)-- C++从入门到开发(C+

iterator erase(iterator position){

if(position +1 != end())

copy(position +1,finish,position)

–finish;

destroy(finish);

return position;

}

clear() 方法:

void clear(){

erase(begin(),end());

}


insert() 插入操作:

这个操作的代码实在是太多的底层细节了,还是看图吧:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


List

Vector可以用数组的知识来覆盖,那么List,就用链表的知识来覆盖吧。

这里要注意:

list对于任何元素的插入和删除,永远都是常数时间,我也得去一探究竟啦,我当初回答错了。

先看看数据结构:

template

struct __list_node{

typedef void* void_pointer;

void_pointer prev;

void_pointer next;

T data;

}

双向链表!!!

list的迭代器和vector的不同,它的要求更高一些。因为链表使用的存储空间往往是零零散散的,所以list的迭代器必须有能力在杂乱的存储空间中快速的跳转。

相对于Vector,List还有一个优势,就是不论如何的插入和接合操作,都不会造成原有的List迭代器失效。List的删除操作也只有指向那个被删除的元素的迭代器失效,其它迭代器不会受影响。

在这里插入图片描述

SGI list不仅仅是一个双向链表,还是个环状双向链表,所以它只需要一个指针,便可以完整的表现链表。

template <class T,class Alloc = alloc> //缺省使用alloc作为配置器

class list{

protected:

typedef __list_node list_node;

public:

typedef list_node* link_type;

protected:

link_type node; //只要一个指针,便可以表示整个循环链表

如果让指针node指向刻意置于尾端的一个空白节点,node便能符合STL对于“前闭后开”的区间要求,成为list迭代器。

iterator begin(){return (link_type)((*node).next);}

iterator end(){return node;}

bool empty() const{return node->next == node;}

size_type size() const{

size_type result = 0;

disance(begin(),end(),result); //一个全局函数

return result;

}

reference front(){return *begin();}

reference back(){return *–end();}

在这里插入图片描述


关于list的增删改查,其实跟链表也就差不多了。


deque


vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。

所谓双向开口,也就是说可以在头尾两端进行插入和删除操作。

vector当然也可以做头部操作,但是其头部操作效率奇差!!!

无法被接受。

(这点以前居然都没有发现!!!)

在这里插入图片描述

deque没有所谓容量的观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。因此,deque没有必要提供所谓的空间保留功能。

但是呢,为什么我们更多的选用vector而非deque呢?因为它的指针实在是太麻烦了。我

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值