对STL中deque、stack、queue、list、Set、Map各容器的特点对比,使用时机,共性机制的总结,以方便于日后个容器的使用。
自我感觉本博客STL分类中的各个博客能让你了解并会使用SLT中的几乎一切基础知识。
一、STL各常用容器特点
(1) deque双端数组
操作特点:在两端插入和删除效率都比较高,在指定位置插入,也会引起数据元素的后移,支持随机访问。(用的少)
deque分段连续内存空间
(2) stack容器
规则:先进后出 ;;不能遍历,不提供迭代器,也不支持随机访问。
While(!stack.empty()){
Cout<<stack.top()<<endl;
Stack.pop();
}
(3) queue队列
规则:先进先出
不能遍历,不提供迭代器,也不支持随机访问
While(!queue。empty()){
Cout<<queue.frout()<<endl;
Queue.pop();
}
(4) list容器
非常常用 STL中双向链表
在任何位置插入和删除效率都比较好,因为插入和删除时候相对于数组来说,不需要移动元素
缺点:不支持随机访问。非连续的内存空间,所以说为了保存结点和结点之间的前驱和后继的关系,需要提供额外的空间开销
自己提供了sort()方法,为什么?因为不支持随机访问,如果使用算法提高平的sort,效率会不稳定。
Find() 你要清楚,查找基础数据类型、查找对象、提供回调(条件)
(5) 对组pair
将两个值合并成一个值
Pair<string,int>pair1;
Make_pair(“aaa”,1);
Pair3=pair1;
二、STL容器使用时机
(1)Vector的使用场景:
比如软件历史操作记录的存储,我们经常要查看历史记录,比如上一次的记录,上上次的记录,但却不会去删除记录,因为记录是事实的描述。
(2)Deque的使用场景:
比如排队购票系统,对排队者的存储可以采用deque,支持头端的快速移除,尾端的快速添加。如果使用vector,则头端移除时,会移动大量的数据,速度慢。
Vector和deque的比较
1》 vector.at()比deque.at()效率高,比如vector.at(0)是固定的,的确的开始位置却是不固定的。
2》 如果大量释放操作的话,vector花的时间更少,这跟二者的内部实现有关。
3》 Deque支持头部的快速插入和快速移除,这是deque的优点
(3)List的使用场景:
比如公交车乘客的存储,随时可能有乘客下车,支持频繁的不确定位置元素的移除插入。
(4)Set的使用场景:
比如对手机游戏的个人得分记录的存储,存储要求从高到低分的顺序排列。
(5)Map的使用场景:
比如按ID号存储十万个用户,想要快速要通过ID查找对应的用户。
二叉树的查找效率,这时就体现出来了。如果是vector容器,最坏的情况下可能要遍历完整个容器才能找到该用户。
三、STL容器共性机制
STL容器所提供的都是值(value)寓意,而非引用(reference)寓意,也就是说当我们给容器中插入元素的时候,容器内部实施了拷贝动作,将我们要插入的元素再另行拷贝一份放入到容器中,而不是将元数据元素直接放进容器中,也就是说我们提供的元素必须能够被拷贝。
若对象里面没指针类型,那么默认构造,直接进行值拷贝
若对象里面有指针类型,那么需要自己写拷贝构造,并且重载等于号(=)
(1) 除了queue和stack 之外,每个容器都提供可返回迭代器的函数,运用返回的迭代器就可以访问元素。
(2) 通常STL不会抛出异常,需要使用者传入正确参数
(3) 每个容器都提供了一个默认的构造函数和默认的拷贝构造函数
(4) 大小相关的构造方法:1》size()返回容器中元素的个数;2》empty()判断容器是否为空。