标签:
代码易读性强;
STL集成了优秀的算法,熟悉使用可以提高开发效率;
精通STL后,可以自己用模板去设计实现自己的算法和数据结构。
STL和其他的类库的接口不太方便。
例如在VCL和MFC中,都有自己的string类型,CString和AnsiString,其余接口如果使用字符串,肯定是使用自己的原生类型,然而为了设计可移植的程序,有可能将平台独立的部分用STL实现,这样导致了在两部分合作时存在大量的转型动作,而且必须付出额外的转型动作,例如std::string和CString/AnsiString没有直接的转型方法,因此必须通过char *作为转型的媒介。
STL没有提供object persistent.(?)
查语法错误不方便,由于广泛使用模板,编译器的提示信息总是千奇百怪,让人摸不找头脑.
调试极不方便,Watch窗口的监视功能等于虚设.还要自己编写代码来查看容器内容.尤其是跟踪到STL内部之后,更让人晕头转向。
优点:典型的序列容器,C++标准严格要求次容器的实现内存必须是连续的,唯一可以和标准C兼容的stl容器,任意元素的读取、修改具有常数时间复杂度,在序列尾部进行插入、删除是常数时间复杂度,但在序列的头部插入、删除的时间复杂度是O(n),可以在任何位置插入新元素,有随机访问功能,能非常方便地进行随机存取,即 [] 操作符,而且两个类型相同的vector变量可以直接做相等操作。
缺点:
初始化复杂:初始化方式vector<int> a(num) ,生成连续的num个0;vector<int> a(num,10),生成num个10;利用pushback()函数;初始化方式较为复杂,不能像数组一样int a[10]={…},进行批量初始化操作;
删除复杂:它维护一段连续的内存空间,具有固定的起始地址,但因为它的内存区域是连续的,所以在它中间插入或删除某个元素,需要复制并移动现有的元素。
不适用于大对象处理:当被插入的内存空间不够时,需要重新申请一块足够大的内存并进行内存拷贝。值得注意的是,vector每次扩容为原来的两倍,对小对象来说执行效率高,但如果遇到大对象,执行效率就低了。
释放空间复杂:vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。vector为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了未清内存,因为vector的capacity容量未变化,系统维护一个的默认值。要内存回收需要更复杂的操作(swap技法就是通过交换函数swap(),使得vector离开其自身的作用域,从而强制释放vector所占的内存空间)
优点:list类似于C语言中的双向链表,它通过指针来进行数据的访问,因此维护的内存空间可以不连续,这也非常有利于数据的随机存取,任意元素的访问、修改时间复杂度是O(n),插入、删除操作是常数时间复杂度,可以在任何位置插入新元素。
缺点:因而它没有提供 [] 操作符重载。
deque类似于C语言中的双向队列,即两端都可以插入或者删除的队列,内存是连续的,可以动态缩小空间。queue支持 [] 操作符,也就是支持随机存取,而且跟vector的效率相差无几。它支持两端的操作:push_back,push_front,pop_back,pop_front等,并且在两端操作上与list的效率也差不多。或者我们可以这么认为,deque是vector跟list的折中。
map类似于数据库中的1:1关系,它是一种关联容器,提供一对一(C++ primer中文版中将第一个译为键,每个键只能在map中出现一次,第二个被译为该键对应的值)的数据处理能力,查找的时间复杂度O(logN),这种特性了使得map类似于数据结构里的红黑二叉树。
和map一样,区别是键可以重复。multimap类似于数据库中的1:N关系,它是一种关联容器,提供一对多的数据处理能力。
set类似于数学里面的集合,不过set的集合中不包含重复的元素,这是和vector的第一个区别,第二个区别是set内部用平衡二叉树实现,便于元素查找,而vector是使用连续内存存储,便于随机存取。关联容器,元素不允许有重复,数据被组织成一棵红黑树,查找的速度非常快,时间复杂度是O(logN)
multiset类似于数学里面的集合,集合中可以包含重复的元素。关联容器,和set一样,却别是允许有重复的元素,具备时间复杂度O(logN)查找功能。
用哪种容器的选择看起来非常繁琐,头脑中如果有个每个容器大概的模型,在选择的时候会更为轻松点。
1. Vector的数据模型就是数组。
优点:内存和C完全兼容、高效随机访问、节省空间
缺点:内部插入删除元素代价巨大、动态大小查过自身容量需要申请大量内存做大量拷贝。
2. List的数据结构模型是链表
优点:任意位置插入删除元素常量时间复杂度、两个容器融合是常量时间复杂度
缺点:不支持随机访问、比vector占用更多的存储空间
3. Deque的数据模型是数组和链表的折衷:
优点:高效随机访问、内部插入删除元素效率方便、两端push pop
缺点:内存占用比较高
4. Map、set、multimap、multiset的数据结构模型是二叉树(红黑树)
优点:元素会按照键值排序、查找是对数时间复杂度、通过键值查元素、map提供了下标访问
首先说说vector、list、deque
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
标签:
原文地址:http://blog.csdn.net/sinat_24520925/article/details/45101991