有关STL的基础内容详见:C++学习16:STL体系结构和基础介绍
1 容器及其分类
容器分为顺序容器和关联容器。
一、顺序容器:按顺序存入数据,通常用的操作是push_back()。
1、Array:大小是固定的,无法扩充;
2、Vector:空间不够时,后面可以(通过分配器)自动扩充,扩充方式是两倍扩充;
3、Deque:空间不够时,前后都可以扩充,但计数时不太方便;
4、List:链表,用双向指针串起来的容器,底层是环形的;
5、Forward-List:单向链表,不如List方便,但省下很多指针占据的空间。
二、关联容器:存键值对(key and value)以便于大量查找,不提供迭代器,通常用的操作是insert()。
1、Set:key和value是不分的,key即value;
2、Map:存key和value,通过key找value,写代码时多用pair操作。
前缀:
1、Unordered:用hash table做的容器(有一个basket,每一个basket后面带着一串链表,每新来一个元素就要计算一下放在哪个basket,尽量避免“碰撞”。)。特点是不定序,即没有定性的排列;而没有Unordered内部用的不是hash table,而多数用红黑树实现。
2、Multi表示key可以重复,没有Multi表示key不可重复,要根据不同的情况进行选择是否用Multi。
2 容器适配器
有栈stack和队列queue,这两个都是由deque进行一系列操作得到的。操作主要是push()和pop()。
3 容器分配器
分配器allocator完成给容器分配内存的工作,只用于容器。如果不处理分配器,每个容器也都会有默认的分配器。影响到速度和空间的运营。
如果要自己写分配器,不是在std中,而是在__gnu_cxx中,可以在ext库中处理,但没有必要也不建议自己制作分配器,而是使用容器。
基础:operator new() 和 malloc(),而operator new()最终也会调用malloc()。
1、分配的内存的样子:蓝色部分才是真正占据的内存,而还有很多附加的东西,这些东西不论开辟了多少,都会增加这些。其中,红色的是cokkie,记录了真正用的大小,自身消耗8个字节;
2、allocator的实现:
allocator只是以::operator new()和::operator delete()完成allocate()和deallocate(),底层就是malloc和free。
注:一个类型后面直接加个圆括号:创建一个临时对象。如:allocator<int>()