STL6大组件
1. 容器
用来存储数据的数据结构
顺序容器
vector、list、deque
顺序容器
关联容器
set、multiset、map、multimap
set
单集合容器,存储关键字
简单使用
insert 插入 _val
erase 定点删除 _where
底层实现
底层以红黑树实现
节点由三个域组成,左孩子L,数据data、右孩子R
特点
不允许关键字重复,提供了基于关键字的快速查询,find是二分查找。
multiset
实现了关键字的可重复性
map
单映射容器、不允许关键字重复,1-1映射
简单使用
insert 插入val
erase 删除
底层实现
以红黑树实现,节点由四个域组成,左孩子L,键key,值val,右孩子R
也可理解成三个域,左孩子L,键值对关系,右孩子R
特点
- 1-1映射
- 基于关键字的快速查询
支持关键字快速访问和查询。
multimap
实现了关键字的可重复性
容器适配器
stack、queue、priority_queue
2. 泛型算法
针对数据进行操作
sort 支持随机访问迭代器容器(vector)
3. 迭代器
容器与泛型算法分离设计,然后再通过迭代器粘合在一起。
所有的迭代器都支持++和解引用*
输入性迭代器
从容器中读取元素
输出型迭代器
给容器写入元素
正向迭代器
结合输入和输出的功能
双向迭代器
不仅支持++也支持–回退
随机访问迭代器
要求对应的容器空间连续,支持任意偏移跳转、++、–
按照功能划分迭代器
- 反转型迭代器 (reverse_iterator、const reverse_iterator)
rbegin()迭代最后一个元素的当前位置
rend()迭代第一个元素的前一位置 - 插入型迭代器
- 前插型front_insert_iterator
- 后插型back_insert_iterator
- 按位置插入insert_iterator
- 流式迭代器
- 输入流istream_iterator
- 输出流ostream_iterator
迭代器失效问题
vector:
push_back:尾部迭代器,即已经指向end()的迭代器就会失效
insert:从插入点到尾部,所有迭代器都会失效。
pop_back:导致尾部迭代器失效
erase:导致从删除点到尾部,所有迭代器都会失效。
扩容:所有迭代器都会失效。
4. 函数对象
5. 适配器
适配器就是转换器,就是将容器转换成另一个容器
容器适配器
stack、queue(通过deque容器的接口实现栈先进后出的特性,实现队列后进先出的特性)
函数适配器
绑定器(将二元函数对象转换成一元函数对象)
bind1st绑定第一个参数、bind2nd绑定第二个参数
取反器(将函数对象的结果取反)
not1给一元函数对象取反,not2给二元函数对象取反
6. 空间配置器
一级空间配置器和二级空间配置器
把对象的内存开辟和对象的构造分开;把对象的析构和内存释放分开。
生成
- 开辟空间(allocate)
- 调用构造(construct)
销毁
- 调用析构(destroy)
- 释放内存(deallocate)
一级空间配置器
alloc和dealloc是对malloc和free做了一个封装
二级空间配置器
自由链表的内存池
alloc从内存池中取,dealloc释放内存给内存池
使用
如果大于128字节,认为开辟内存足够大,不容易产生碎片。就使用一级空间配置器。
如果小于128字节,内存比较小,就容易产生碎片。就是用二级空间配置器。