用了快一年的STL库,决定写一下这一年的使用心得与总结。
1、概述
个人觉得 STL == {算法,容器,迭代器};
类型 | 头文件 |
---|---|
算法 | include < algorithm > |
迭代器 | include < iterator > |
容器 | include< map/ vector/ set / list / queue/ …> |
C++primer 上有一句非常经典的话“”算法操作容器,但不改变容器!“”
这个操作容器:指的是 通过 iterator 遍历容器。
不改变容器:指的是不改变容器的性质,最重要的是size。
但是:算法不改变容器,有的时候还必须改变容器的size。这个由谁来做呢? 答:迭代器。例如:back_inserter
Effective c++上有一句话:不要使用过期的迭代器 !
迭代器会过期(失效)? vector上的任意一次插入,或者删除都可能导致迭代器失效。例如,从中间插入一个元素,那后面就会的迭代器(指针)都失效了。因此有数据在内存上的移动。
有人认为push_back不会导致迭代器失效:这更小小心了,假设现在vector要扩容,push_back后原来所有的得iterator都失效。
此时你用find,copy等算法,操纵无效迭代器,来想返回你期望的结果,结果可想而知。
1.1 数据结构
+-+-+-+-+-+-+-+-+-+-+-+-+-+- 分割线 -+-+-+-+-+-+-+-+-+–+-+-+-+-
STL 中提供了哪些数据结构:线性表(链表list,动态数组vector)
包括红黑树(Set 、map),Hash表(unordered_map、unordered_set)
以及二叉堆/ 优先队列(priority_quene),这个数据结构支持插队,也就是优先级高的任务,插到任务队列的对应位置。此数据结构的插入操作时间复杂度为O(logn),而在线性表中,频繁的插入操作时间复杂度为O(n)。
队列(queue),栈(stack)
+-+-+-+-+-+-+-+-+-+-+-+-+-+- 分割线 -+-+-+-+-+-+-+-+-+–+-+-+-+-
2、算法
···
3、容器
···
4、迭代器
迭代器中在I/O中有一个经典的应用
1- 从输入读入一系列的 数字/字母/字符串 放入到特定的容器。
vector<