STL容器类是可以包含其他对象的类。就像数组,队列,堆栈等数据结构可以包含整数,小数,类等数据成员一样,STL包含常见的向量类,链表类,双向队列类,集合类和图类,每一个类都是一种模板,并且这种模板可以包含各种类型的对象。
容器可以分成两大类,序列式容器(SEQUENCE CONTAINER) 和关联式容器(ASSOCIATE SEQUENCE CONTAINER )。在序列式容器中主要有vector、list、
stack、queue、priority_queue和deque;而关联式容器则包括:set、map、multiset和multimap。
- vector是一种大小可变的序列,比较灵活。
- list是一个双向链表容器,完成了标准的C++数据结构中链表的所有功能。
- queue是一个队列容器,完成了标准的C++数据结构中队列的所有功能。
- stack是一个堆栈容器,完成了标准的C++数据结构中堆栈的所有功能。
- deque是一个双端队列容器,完成了标准的C++数据结构中队列的所有功能。
- set是一个集合容器,不允许出现重复元素。
- map是一个关联式容器。
容器技术概述
STL提供多种容器,由于每种容器都包含一组操作行为,所以其所含的成员,值得研究。容器成员必须满足一下三个条件:
- 元素必须是可拷贝的。所有容器都会产生一份自己的元素副本,这样才不会发生别名问题(指两个不同的对象代表相同一块内存)。所有容器操作行为传回的也都是其元素的一个副本。
- 元素必须是可释放的(通过析构函数)。当使用者将元素从容器中删除时,意味着容器必须释放其元素所占空间。因此元素类所具备的析构函数决不能被设计为私有的。
- 元素必须是可赋值的,容器的操作行为以及各种STL算法,都利用赋值操作符来为元素指派新值。
序列式容器:
- vector一个随机访问的序列容器,它提供了对容器内元素的快速,随机的访问,以及序列尾部快速的插入和删除操作。它在需要时可以改变容器的大小,可取代C++语言自身的数组。vector提供随机存取的能力,序列尾部的速度最快。
list 一个双向链表容器,不支持容器内元素的随机访问。插入和删除操作的效率是固定的。注意:许多STL算法在list容器上会有不佳的效率,因为这些算法主要是进行元素的移动,list自身实现的算法,只操作指针,而非真正复制或移动元素。如:list自身存在成员函数remove ,算法中也存在remove函数,应该优先选用list 自身的成员函数remove.
deque 一个随机访问的序列容器,他提供了对容器内元素的快速,随机的访问,以及序列首部和尾部快速的插入和删除操作。
stack 一个栈容器,提供入栈,出栈,获取栈顶元素等操作,实现先入后出(FILO)的特性
- queue 一个队列容器,实现先入先出(FIFO)的特性。
关联式容器
- 无序表(unordered table)C++11标准引入。
- set 一个随机存取的集合容器
- map一个关联存取的集合容器