![a114a3fb76008ea8ea302722bc748add.png](https://i-blog.csdnimg.cn/blog_migrate/0d2a18c8878663e10a1a3c592d0fa246.jpeg)
写在前面。本文总结自C++Primer和STL源码分析。可能不太适合初学者,仅为对自己学习的一个总结和回顾,希望能帮到有同样需求的人。后面原理写了迭代器,vector和list的实现。红黑树相关的关系容器感觉写的有点草率,先放放。
顺序容器(sequenial container)
STL标准库中,提供了多种不同的顺序容器,可变大小数组vector,双端队列deque,双向链表llist,固定大小数组array等。不同的容器在以下两方面都有不同的性能折中:
- 向容器添加或从容器删除元素的代价。
- 非顺序访问容器中元素的代价。
容器保存元素的策略对容器操作的效率有着固有的,重大的影响,不同容器的存储策略影响特定容器是否支持特定的操作。
- string和vector将元素保存在连续的内存空间中。可快速通过下标访问。但从中间位置添加或删除元素非常耗时。
- list和forward_list设计目的是令容器在任意位置的元素添加和删除都非常迅速。相应的代价是不支持随机访问,访问特定元素需要遍历整个容器。且链表需要分配大量的额外空间。
- deque在两端添加删除的速度很快,但在中间添加删除元素代价依旧很高。deque支持快速的随机访问。
确定使用哪种容器
- 除非有充分的理由选择其他容器,否则vector永远是最好的选择。
- 如果元素中有大量小元素且内存额外开销很重要,避免使用list和forward_list。
- 如果要求随机访问,应使用vector或deque。
- 如果程序要求在中间插入或删除,应使用list或forward_list。
- 如果程序需要在头尾插入删除,则应使用双端队列deque。
- 如果程序开始时需要中间插入,之后需要随机访问。
- 可以使用sort函数重排未实现中间插入的元素。
- 可以使用list完成输入任务,之后将中间插入后的元素拷贝到vector中。
迭代器(iterator)
迭代器类似于指针,w提供对对象的间接访问。
迭代器范围由一对迭代器表示。迭代器的end标识指向容器最后一个容器之后的元素。故迭代器的范围是一个左闭合区间。
auto
赋值与swap
vector
swap操作不会对任何元素进行拷贝,删除插入,可以在常数时间内完成操作。故指向容器的迭代器,引用,指针在swap操作之后不会失效。
由于赋值运算符要求左边和右边的运算对象具有相同的类型。所以定义assign的成员,允许从一个不同但相容的类型赋值,或者从容器的一个子序列赋值。
list
顺序容器操作
TIPS:在向一个vector,string或deque插入元素会使得所有指向容器的迭代器,引用指针失效。
使用push_back
push_back放入容器中的是元素的拷贝。容器中的元素与提供对象之间没有任何关联。随后对容器中元素的任何改变都不会影响原始对象。
使用insert的返回值
list