STL容器vector、list和deque的区别

容器用得太频繁了,就开始关注效率的问题,在某些地方开始寻求替代方案。最近常用的几个容器就是vector、list和deque。

vector和数组类似,拥有连续的内存空间,其起始地址是固定不变的,因此能支持很好地随机存取,也就是能像数组一样通过[]来访问其元素。vector使用动态数组的方式实现,其内部已经集成了内存管理功能(内部使用allocator类进行内存管理),包括内存的分配、释放、自动回收等,因此,可以让程序员把大部分精力放在业务本身,而不用过度关心内存管理方面的问题。

当使用insert或push_back为vector对象增加元素时,如果动态数组的内存不够用,就需要动态地重新分配内存,新分配的内存大小一般是当前大小的两倍,然后把原数组的内容拷贝过去。所以,虽然vector有很好的随机存储性能,但在发生内存的重新分配时,其性能就会明显下降。如果有大量的数据需要push back,应使用reserve()函数先设定其容量,避免许多次的容量扩充造成的效率低下。

list由双向链表实现,它的内存可以是不连续的,只能通过指针来进行数据的访问,因此它的随机存取非常没有效率,遍历中间的元素时,搜索复杂度为O(n),也没有重载[]操作符。但由于链表的特点,list可以很好地支持任意地方的插入和删除。

由于list内存不连续,因此其迭代器list::iterator也不支持“+”、“+=”、“<”等操作,只能通过“++”迭代。对比而言,vector::iterator则能很好地支持“+”、“+=”、“<”等操作符。

再来说说deque,deque是双向队列容器,其表面上与vector非常相似,在很多实际应用中也能直接替换vector。但deque提供在首尾两端进行插入和删除元素的操作,因此比vector多了push_front()和pop_front()两个方法。deque使用一段一段的定量内存,在内存扩充时也只是加一段定量内存,由于其内存是分段连续的,因此对于insert操作来说,在不同段中的插入效率是相同的。而对于vector来说,插入的位置决定了执行的效率,插入的位置越靠前,效率越低。

下面列举一下几个容器在C++11中的成员函数,以供参考。

vector的成员函数:

list的成员函数:

deque的成员函数:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章