Java 中的vector和list的区别和使用实例详解
要了解vector,list,deque。我们先来了解一下STL。
STL是StandardTemplateLibrary的简称,中文名是标准模板库。从根本上说,STL是一些容器和算法的集合。STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。指针被封装成迭代器,这里vector,list就是所谓的容器。
我们常常在实现链表,栈,队列或者数组时,都会写着一些重复或者相似的代码,还要考虑各种可能出现的问题。而STL的引入,大大提高了代码的复用性。我们在实现这些代码时,只要引入头文件就可以灵活的应用了。
vector的使用
连续存储结构:vector是可以实现动态增长的对象数组,支持对数组高效率的访问和在数组尾端的删除和插入操作,在中间和头部删除和插入相对不易,需要挪动大量的数据。它与数组最大的区别就是vector不需程序员自己去考虑容量问题,库里面本身已经实现了容量的动态增长,而数组需要程序员手动写入扩容函数进形扩容。
Vector的模拟实现
templateclassVector { public: typedefT*Iterator; typedefconstT*Iterator; Vector() :_start(NULL) ,_finish(NULL) ,_endOfStorage(NULL) {} voidtemplate PushBack(constT&x) { Iteratorend=End(); Insert(end,x); } voidInsert(Iterator&pos,constT&x) { size_tn=pos-_start; if(_finish==_endOfStorage) { size_tlen=Capacity()==0?3:Capacity()*2; Expand(len); } pos=_start+n; for(Iteratorend=End();end!=pos;--end) { *end=*(end-1); } *pos=x; ++_finish; } IteratorEnd() { return_finish; } IteratorBegin() { return_start; } voidResize(size_tn,constT&val=T())//用Resize扩容时需要初始化空间,并且可以缩小容量 { if(n capacity) { T*tmp=newT[n]; for(size_ti=0;i list的使用
非连续存储结构:list是一个双链表结构,支持对链表的双向遍历。每个节点包括三个信息:元素本身,指向前一个元素的节点(prev)和指向下一个元素的节点(next)。因此list可以高效率的对数据元素任意位置进行访问和插入删除等操作。由于涉及对额外指针的维护,所以开销比较大。
vector和list的区别
*vector的随机访问效率高,但在插入和删除时(不包括尾部)需要挪动数据,不易操作。
*List的访问要遍历整个链表,它的随机访问效率低。但对数据的插入和删除操作等都比较方便,改变指针的指向即可。
*list是单向的,vector是双向的。
*vector中的迭代器在使用后就失效了,而list的迭代器在使用之后还可以继续使用。
List的模拟实现
templateclassList { typedef__ListNode Node; public: typedef__ListIterator Iterator; typedef__ListIterator ConstIterator; IteratorBegin() { return_head->_next; } IteratorEnd() { return_head; } ConstIteratorBegin()const { return_head->_next; } ConstIteratorEnd()const { return_head; } List() { _head=newNode(T()); _head->_next=_head; _head->_prev=_head; } //l2(l1) List(constList&l) { _head=newNode(T()); _head->_next=_head; _head->_prev=_head; ConstIteratorit=l.Begin(); while(it!=l.End()) { PushBack(*it); ++it; } } ~List() { Clear(); delete_head; _head=NULL; } voidClear() { Iteratorit=Begin(); while(it!=End()) { Node*del=it._node; ++it; deletedel; } _head->_next=_head; _head->_prev=_head; } voidPushBack(constT&x) { Insert(End(),x); } voidPushFront(constT&x) { Insert(Begin(),x); } voidPopBack() { Erase(--End()); } voidPopFront() { Erase(Begin()); } voidInsert(Iteratorpos,constT&x) { Node*cur=pos._node; Node*prev=cur->_prev; Node*tmp=newNode(x); prev->_next=tmp; tmp->_prev=prev; tmp->_next=cur; cur->_prev=prev; } IteratorErase(Iterator&pos) { assert(pos!=End()); Node*prev=(pos._node)->_prev; Node*next=(pos._node)->_next; prev->_next=next; next->_prev=prev; deletepos._node; pos._node=prev; returnIterator(next); } protected: Node*_head; }; 总结
以上所述是小编给大家介绍的Java中的vector和list的区别和使用实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对毛票票网站的支持!