码迷,mamicode.com
首页 > 其他好文 > 详细

STL模版的优缺点

时间:2015-04-18 08:54:41      阅读:2907      评论:0      收藏:0      [点我收藏+]

标签:

STL优点:

代码易读性强;

STL集成了优秀的算法,熟悉使用可以提高开发效率;
精通STL后,可以自己用模板去设计实现自己的算法和数据结构。

STL缺点:

STL和其他的类库的接口不太方便。
例如在VCL和MFC中,都有自己的string类型,CString和AnsiString,其余接口如果使用字符串,肯定是使用自己的原生类型,然而为了设计可移植的程序,有可能将平台独立的部分用STL实现,这样导致了在两部分合作时存在大量的转型动作,而且必须付出额外的转型动作,例如std::string和CString/AnsiString没有直接的转型方法,因此必须通过char *作为转型的媒介。

STL没有提供object persistent.(?)

查语法错误不方便,由于广泛使用模板,编译器的提示信息总是千奇百怪,让人摸不找头脑.
   
调试极不方便,Watch窗口的监视功能等于虚设.还要自己编写代码来查看容器内容.尤其是跟踪到STL内部之后,更让人晕头转向。

  我们常用到的STL容器vectorlistdequemapmultimapsetmultiset,它们究竟有何区别,各自的优缺点是什么,为了更好的扬长避短,提高程序性能,在使用之前需要我们了解清楚。

Verctor

优点:典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问功能,能非常方便地进行随机存取,即 [] 操作符,而且两个类型相同的vector变量可以直接做相等操作。

缺点:

初始化复杂:初始化方式vector<int> a(num) ,生成连续的num0vector<int> a(num10),生成num10;利用pushback()函数;初始化方式较为复杂,不能像数组一样int a[10]={…},进行批量初始化操作;

删除复杂:它维护一段连续的内存空间,具有固定的起始地址,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。

不适用于大对象处理:当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。

释放空间复杂:vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。vector为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了未清内存,因为vectorcapacity容量未变化,系统维护一个的默认值。要内存回收需要更复杂的操作(swap技法就是通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间

 

List

优点:list类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,任意元素的访问、修改时间复杂度是O(n),插入、删除操作是常数时间复杂度,可以在任何位置插入新元素。

缺点:因而它没有提供 [] 操作符重载。

deque

deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列,内存是连续的,可以动态缩小空间。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。或者我们可以这么认为,dequevectorlist的折中。

map

map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,查找的时间复杂度O(logN),这种特性了使得map类似于数据结构里的红黑二叉树。

multimap

map一样,区别是键可以重复。multimap类似于数据库中的1N关系,它是一种关联容器,提供一对多的数据处理能力。

set

set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。关联容器,元素不允许有重复,数据被组织成一棵红黑树,查找的速度非常快,时间复杂度是O(logN)

multiset

multiset类似于数学里面的集合,集合中可以包含重复的元素。关联容器,和set一样,却别是允许有重复的元素,具备时间复杂度O(logN)查找功能。

小结、各种容器的优缺点:

用哪种容器的选择看起来非常繁琐,头脑中如果有个每个容器大概的模型,在选择的时候会更为轻松点。

1.      Vector的数据模型就是数组。

优点:内存和C完全兼容、高效随机访问、节省空间

缺点:内部插入删除元素代价巨大、动态大小查过自身容量需要申请大量内存做大量拷贝。

2.      List的数据结构模型是链表

优点:任意位置插入删除元素常量时间复杂度、两个容器融合是常量时间复杂度

缺点:不支持随机访问、比vector占用更多的存储空间

3.      Deque的数据模型是数组和链表的折衷:

优点:高效随机访问、内部插入删除元素效率方便、两端push pop

缺点:内存占用比较高

4.      Mapsetmultimapmultiset的数据结构模型是二叉树(红黑树)

优点:元素会按照键值排序、查找是对数时间复杂度、通过键值查元素、map提供了下标访问

使用情况:

首先说说vectorlistdeque

1)如果需要随机访问,用vector

2)如果存储元素的数目已知,用vector

3)需要任意位置随机插入删除,用list

4)只有需要更多在容器的首部尾部插入删除元素,用deque

5)元素是复杂结构用list,也可以用vector存储指针(需要额外的精力去维护内存),看需求

6)如果操作是基于键值,用set map

7)如果需要经常的搜索,用map set

8 map set的区别是map中的元素都是pair<key, value>,同时map提供下标访问。

部分内容参考:

http://blog.csdn.net/aa4790139/article/details/20617023

STL模版的优缺点

标签:

原文地址:http://blog.csdn.net/sinat_24520925/article/details/45101991

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!