STL序列容器
2014-02-15 23:17
183 查看
序列容器:逻辑上有序,但是实际上其地址不一定是连续的.
序列容器包括vector,list,deque,queue,priority_queue,stack.
我们下面对每一个容器进行分析.
vector容器
大家对vector一定非常熟悉了.当内存不足时候,会对vector进行扩容,扩容的方式是先申请一个更大的空间,然后把原来的数据复制到新的空间上,释放原先的空间.
![](http://img.blog.csdn.net/20140215231620937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzAwOTU3NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
vector的思想就是这么简单.
但是这回造成什么呢?迭代器失效:在删除一个元素后,begin不会失效,删除元素的迭代器和end迭代器都会失效.
list容器:
一个双向循环链表.
![](http://img.blog.csdn.net/20140215231627531?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzAwOTU3NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这里可以清楚的看出,list是一个双向链表.他的查找效果比单向链表更好.这里要特别讲一下node节点,他是用于标记尾节点的指针.
deque容器
![](http://img.blog.csdn.net/20140215231630718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzAwOTU3NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
这个图看起来很乱,其实一点也不复杂.
map:用于管理存储区,每当内存不够的时候,就向前扩充一个空间,或者向后扩充,当map用完以后,会再次申请把一个大内存,复制map中的数据,然后销毁旧的map.数据存储区域并不动.
start,finish:这里面还有两个迭代器,是deque中的数据,他们分别指向deque首部和尾部.
deque中迭代器失效:收尾添加数据仅能是当前迭代器(自己定义的迭代器)失效,需要重新复制,deque是不应该向中间添加数据的,如果强制向中间部分添加数据会造成所有迭代器同时失效.deque是可以存储引用值的,因为数据存储区不会进行拷贝.
map,他并不是容器,他是pritority_queue的底层实现.和上面那个图中的那个map毫不相关.
pritority_queue底层实现是使用map,即一个用vector实现的完全二叉堆.
![](http://img.blog.csdn.net/20140215231633515?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzAwOTU3NQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
每当新插入一个数据就会在后面添加一个数据,然后保持堆的性质,返回优先级最高的数据.该类型默认是比较<,一般使用该数据都要重载一个<操作符.
他并没有实现迭代器,所以不存在迭代器失效问题.
序列容器包括vector,list,deque,queue,priority_queue,stack.
我们下面对每一个容器进行分析.
vector容器
大家对vector一定非常熟悉了.当内存不足时候,会对vector进行扩容,扩容的方式是先申请一个更大的空间,然后把原来的数据复制到新的空间上,释放原先的空间.
vector的思想就是这么简单.
但是这回造成什么呢?迭代器失效:在删除一个元素后,begin不会失效,删除元素的迭代器和end迭代器都会失效.
list容器:
一个双向循环链表.
这里可以清楚的看出,list是一个双向链表.他的查找效果比单向链表更好.这里要特别讲一下node节点,他是用于标记尾节点的指针.
deque容器
这个图看起来很乱,其实一点也不复杂.
map:用于管理存储区,每当内存不够的时候,就向前扩充一个空间,或者向后扩充,当map用完以后,会再次申请把一个大内存,复制map中的数据,然后销毁旧的map.数据存储区域并不动.
start,finish:这里面还有两个迭代器,是deque中的数据,他们分别指向deque首部和尾部.
deque中迭代器失效:收尾添加数据仅能是当前迭代器(自己定义的迭代器)失效,需要重新复制,deque是不应该向中间添加数据的,如果强制向中间部分添加数据会造成所有迭代器同时失效.deque是可以存储引用值的,因为数据存储区不会进行拷贝.
map,他并不是容器,他是pritority_queue的底层实现.和上面那个图中的那个map毫不相关.
pritority_queue底层实现是使用map,即一个用vector实现的完全二叉堆.
每当新插入一个数据就会在后面添加一个数据,然后保持堆的性质,返回优先级最高的数据.该类型默认是比较<,一般使用该数据都要重载一个<操作符.
他并没有实现迭代器,所以不存在迭代器失效问题.
相关文章推荐
- 无线AP
- 论坛推广方法总结
- 第一个c++程序
- Ubuntu - ibus - Install IBus on Ubuntu
- Unity3D笔记 愤怒的小鸟<四> 实现Selelction界面
- 在Android中使用 asmack 实现文件的接收和发送
- Unity3d使用过程中常见的20个问题
- js中的面向对象的prototype,call的用法
- Hdu 3429 Resistors (分数模板 递归读入)
- 网络编程
- warning C4150: deletion of pointer to incomplete type 'xxx'; no destructor called 的解决办法
- Linux进程浏览器htop安装与使用
- Can't find file: './mysql/plugin.frm' (errno: 13)[mysql数据目录迁移错位]错误解决
- 自媒体如何在三大平台赚钱
- iOS uiscrollView 嵌套 问题 的解决
- 如何部署war文件到tomcat下
- 各软件对打车顾客和出租司机的影响
- 网络推广之论坛营销发帖推广
- 以主题域规划DW
- 迭代模式(Iterator Pattern)