标签:
STL标准模板库作为C++标准库的一部分,其组件包括:容器、算法、迭代器、仿函数、配接器、配置器。
今天来说说容器,容器主要可以分为两种:序列式容器(元素是可序的,但并非有序)、关联式容器。
一、序列式容器
1、vector
1)vector和C/C++的内置数组类似,只不过array空间是静态的,vector的空间则是可以改变的,当元素个数达到空间上限时,会重新分配空间,进行复制,然后删除原空间数据。
2)vector占用一段连续的存储空间,其内部含三个指针,分别指向:该连续空间的开头、结尾及目前存放元素空间的结尾。
3)vector进行元素插入或删除时,可能会引起空间的重新配置,进而使所有的迭代器失效。
2、list
1)list底层采用双向循环链表构成,头尾之间有一空白节点,所以迭代器可以前进或后退。
2)相较于vector,list支持push_front、pop_front
3)vector和list的选取:当元素插入删除频率,对随机读取要求不高时,选用list;当数据需要频繁读取,且对读取时间效率要求较高时用vector。
3、slist(single list)
1)slist底层采用单向非循环链表构成,其迭代器只能前进,进行数据插入时必须要从头节点开始遍历。
2)为效率考虑,slist只提供push_front、pop_front而没有push_back、pop_back。
3)slist所占空间相对于list来说较少。
4、deque
1)deque是双向开口的连续线性空间,所以同时支持push_front、push_back。
2)号称连续,但并非真的连续,它仅仅是将多个定量的连续空间连接在一起,所以deque需要一个中控器来维护其整体连续的假象。
3)主控map是一块连续的空间,和容器一样,当连续空间存放full之后会重新配置一块连续的区域,主控中存放的是一个个指向连续区域的指针,每个区域的大小是固定的,可以由用户指定。deque<int,alloc,n>,n(个)即缓冲区的大小。
4)deque可以理解为vector和list的结合。
5、stack、queue
1)用的比较多的两个容器:栈、队列
2)stack\queue可以理解为一种配接器,是对其他容器的一种修饰,只支持少数操作,不能遍历。
3)stack\queue底层的实现可以是deque也可以是list,可以由用户自己指定,默认情况下是deque。
6、heap
1)heap与其说是一种容器,其实更多是一种算法,利用其可以对数组或容器进行调整,构建成堆或排序等。
2)heap要求是完全二叉树,所以可以用数组来存储堆(隐式储存),且heap是一个最大堆。
3)heap是以算法形式呈现的,它没有迭代器。
4)主要包括以下算法:
push_heap(iterator,iterator):以两个迭代器作为参数,当新push_back一个新元素后,调用此函数,使容器仍为最大堆形式。
pop_heap(iterator,iterator):以两个迭代器作为参数,将堆的根结点放置到容器最后,并保持此前的元素仍为最大堆,即最大pop_heap之后,最大值位于容器的尾部。
make_heap(iterator,iterator):将两个迭代器之间的元素构建成为最大堆。
sort_heap(iterator,iterator):将两个迭代器之间的元素进行堆排序。
7、priority_queue
1)和之间的stack\queue一样,priority_queue也是采用其他容器配合heap实现,缺省时以vector作为底层实现容器。
2)priority_queue会在元素插入时进行排序,值最大的放在堆的顶部。
3)priority_queue不提供遍历功能,只能获取堆顶部元素,即只能由顶部出队列。
4)queue和priority_queue功能其实相差不大,只不过前者是先进先出,后者是优先级较高的先出,都不提供遍历功能。
二、关联式容器
关联式容器主要有以下两种:set(集合)和map(映射表)。由二者又衍生出两类:multiset(多键集合)和multimap(多键映射表)。此四者均由红黑树实现。除此之外,还有hash_set\hash_map\hash_multiset\hash_multimap,此四者底层都由哈希表实现。
1、关联式容器的主要目的是为实现快速读取,红黑树是有序的,所以前者都是自动排序的,而哈希表是无序的,所以后者不能自动排序。
2、set元素值就是键值,它没有键值和实值的区别,map同时拥有键值和实值。
3、set\map\hash_set\hash_map都不允许键相同,且键的值是不允许更改的,而multiset\multimap\hash_multiset\hash_multimap是可以的键是可以相同的。
4、关联式容器都可以利用迭代器进行输出。
标签:
原文地址:http://blog.csdn.net/walker19900515/article/details/47132885