35.c/c++程序员面试宝典-容器
STL是一个标准的c++库,容器是其中的一个重要组成部分。在实现容器时主要提供了顺序容器和关联容器。STL为容器的遍历提供了迭代器、STL也提供了100多种算法的实现。这些算法包括有顺序、遍历等。
面试题132 什么是容器****
分析:容器是容纳特定类型对象的集合,因此容器中的对象必须是同一类型,而且该类型必须是可拷贝构造和可赋值的,所以包括的类型有内置的基类数据类型和带有公用拷贝构造函数和赋值操作符的类。STL中提供的容器有vector、list。deque、set、multiset、map、multimap等。
在STL中,容器一般用模板类来实现。不过STL并没有采用面向对象的技术,所以在STL中并没有一个通用的容器类,各种具体的容器也没有统一的基类。
容器可以视为数组的扩展,即对象的数组(广义数组),其中的元素(对象)通过容器对“[]”的重载,可以和数组一样利用下标(索引)来访问。
注意:STL中的容器可以包含的类型有内置的基本数据类型和带有公用拷贝构造函数和赋值操作符的类。
在STL中提供了两种类型的容器:顺序容器和关联容器。这两种分类下面是各种具体的容器:
(1)顺序容器,指的是将一组具有相同类型T的对象,以严格的线性形式组织在一起。顺序由容器可以视为数组和链表的推广。包括有一下3种顺序容器。
vector<T>;
deque<T>;
list<T>
(2)关联容器,提供一个key(键)实现对元素的随机访问,其特点是key是有序的,即元素是按预定义的键顺序(例如升序)插入的。关联容器具有从基于键的集合中快速提取对象的能力,其中集合的大小在运行时是可变的。关联容器可以视为关联数组、映射或字典的推广,它们保存的都是键值对,给定了其中的一个别称为键的值,就可以快速访问与其对应的另一个键的值。STL中的关联容器有以下4种。
1)set<Key>(集合):支持唯一键值,并提供对象本身的快速检索,例如set<long>{学号}(set类的头文件<set>);
2)multiset<key>(多重集合):支持可重复键值,并提供对键本身的快速检索;例如set<string>;{姓名}(可能的同名的)(multiset类的头文件是<set>);
3)map<Key,T>:支持唯一Key类型的键值,并提供对另一个基于键的类型T的快速检索;例如map<long,string>:{(学号,姓名)}、{(电话号码,姓名)}等(map类的头文件是<map>);
4)multimap<Key,T>(多重映射):支持可重复Key类型的键值,并提供对另一个基于键的类型T的快速检索;例如map<string,string>:{(姓名,地址)}、{(姓名,年龄)}等(multimap类的头文件是<map>)。
除了这两种以外,还有一种容器是容器适配器。不过容器适配器不是独立的容器,只是某种容器的变种,它提供原容器的一个专用的受限接口。特别是,容器适配器和普通容器的不一样是在于不提供迭代器。在STL中有3种容器适配器,具体如下。
1)stack<T>(栈):只支持top()(读取栈顶元素)、push()(在栈顶处加入新元素)和pop()(取出栈顶元素)操作(先入后出)的一种序列容器。(stack类的头文件是<stack>)。
2)queue<T>(队列):与stack类似,queue也是对序列容器的限制实现。与栈相比,队列也支持back()(读取队尾处的元素)和push_back()(在队尾处插入新元素)操作,但是不支持pop_back()(取出队尾处的元素)操作。不过,队列允许front()(读取队首处的元素)和pop_fornt()(取出队首处的元素)操作(前出后入)。(queue类的头文件是<queue>)
3)priority_queue<T>(优先队列):也是一种队列queue,不过其中的每个元素都被给定了一个优先级,用来控制元素到达队首top()的顺序。默认情况下,优先队列简单地使用运算符<进行元素比较,top()返回最大的元素。