标题
STL将常见的数据结构以模板的方式进行封装,还增加了一些灵活通用的算法
迭代器
Iterator模式是运用于聚合对象的一种模式,通过运用该模式,使得我们可以在不知道对象内部表示的情况下,按照iterator提供的方法访问聚合对象中的各个元素
迭代器和指针的区别
迭代器不是指针,是类模板,表现的像指针。
只是模拟了指针的一些功能,通过重载了指针的一些操作符,->、*、++、–等。本质是封装了原生指针,根据不同类型的数据结构来实现不同的++,–等操作。
迭代器失效
vector所有的插入和扩容操作可能会出现,swap,赋值=,删除
- vector的扩容会生成新空间,并进行拷贝到新空间释放原空间,迭代器还指向
原来的空间 - 删除pos位置的元素,删除成功,迭代器失效
解决
在迭代器可能会失效的操作之后,要重新使用迭代器,就需要对迭代器进行重新赋值,erase就会返回下一个有效迭代器
- 对于关联容器map set来说,使用erase后,当前元素的迭代器失效,但是其结构是红黑树,删除当前元素,不会影响到下一个元素的迭代器,
- 所以在调用erase之前,记录下一个元素的迭代器即可。
空间配置器:
STL allocator将两个阶段操作区分开来:
- 内存配置有allocate()负责,内存释放由deallocate()负责;
- 对象构造由construct()负责,对象析构由::destroy()负责。
- 例如vector里面申请空间就使用的空间配置器,malloc和new不适应于频繁的申请空间