容器
首先看一下容器在STL中的位置:
可以看到,容器是STL中很重要的一部分。从字面意思理解,容器就是存贮东西的地方。
容器是存贮数据的地方,在泛型的基础上,设计的用于数据存贮、运算、表示的模型,称之为容器。
容器的特点之内存托管
语言的发展历史从c到c++到java到python,其中有一个不同就是内存的管理机制。
在c中,内存需要手动申请,手动释放。就是需要吃完饭自己洗碗。python是吃完饭不要自己洗碗。这就是内存托管。
容器采用了内存的托管机制,也就是说,放入容器中的对象,对象内存由容器来统一管理,我们只需要使用容器即可。
但如果托管的是指针,容器只负责,指针本身的内存大小,而其指向的空间还要作单独处理。
容器的分类
容器的分类是根据底层的数据结构来进行划分的
容器主要分为四类:
1.有序容器sequence containers
2.关联容器associative containers
3.无序容器 unordered containers
4.容器适配器 container adapter
但是图中没有体现出第四种容器,容器适配器,这是因为容器适配器没有单独的内存模型,容器适配器是基于以上容器形成的。
容器适配器有三种:stack,queue,priority_queue ,其中stack和queue是基于deque实现的,priority_queue是基于vector实现的。
为什么需要容器适配器呢,比如vector是一个牛刀,现在要杀一只鸡,用牛刀太浪费了,所以priority_queue出现了,它就是一个鸡刀,用来杀鸡,省力而且顺手。
容器的适用场景
– | vector | deque | list | set | mulitset | map | mulitmap |
---|---|---|---|---|---|---|---|
内部结构 | dynamic array | array of arrays | double linked list | binary tree | binary tree | binary tree | binary tree |
随机存取 | 是 | 是 | 否 | 否 | 否 | 是(通过key) | 否 |
搜索速度 | 慢 | 慢 | 很慢 | 块 | 块 | 块 | 块 |
快速插入移除 | 尾部 | 首尾 | 任何位置 | - | - | - | - |