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的增删改查,其实跟链表也就差不多了。
vector是单向开口的连续线性空间,deque则是一种双向开口的连续线性空间。
所谓双向开口,也就是说可以在头尾两端进行插入和删除操作。
vector当然也可以做头部操作,但是其头部操作效率奇差!!!
无法被接受。
(这点以前居然都没有发现!!!)
deque没有所谓容量的观念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来。因此,deque没有必要提供所谓的空间保留功能。
但是呢,为什么我们更多的选用vector而非deque呢?因为它的指针实在是太麻烦了。我