STL中关于map和set的一些问题
来源:互联网 发布:java rs232c 编辑:程序博客网 时间:2024/05/17 21:42
1,STL封装了许多复杂的数据结构算法和大量常用数据结构操作,如vector封装数组,list封装了链表,map和set封装了二叉树等,另外STL采用自己的Allocator分配内存,以内存池的方式来管理这些内存,大大减少内存碎片的产生,从而提升系统的整体性能
2, STL中标准关联容器set,multiset, map, multimap内部采用的是一种非常高效的平衡检索二叉树:红黑树,也成为RB树(Red-BlackTree)。RB树的统计性能要好于一般的平衡二叉树(有些书籍根据作者姓名,Adelson-Velskii和Landis,将其称为AVL-树),所以被STL选择作为了关联容器的内部结构
3,为何map和set的插入删除效率比用其他序列容器高?
因为对于关联容器来说,不需要做内存拷贝和内存移动,map和set容器内所有元素都是以节点的方式来存储,其节点结构和链表差不多,指向父节点和子节点,因此插入的时候只需把节点的指针指向新的节点,删除的时候把指向删除节点的指针指向其他节点就好了,一切操作都是指针操作,和内存无关,所以效率高
4,为何每次insert之后,以前保存的iterator不会失效?
iterator相当于指向节点的指针,内存没有变,指向内存的指针自然不会失效(当然被删除的元素本身已经失效了)。相对于vector来说,每一次删除和插入,指针都有可能失效,调用push_back在尾部插入也是如此。因为为了保证内部数据的连续存放,iterator指向的那块内存在删除和插入过程中可能已经被其他内存覆盖或者内存已经被释放了。即使是push_back的时候,容器内部空间可能不够,需要一块新的更大的内存,只有把以前的内存释放,申请新的更大的内存,复制已有的数据元素到新的内存,最后把需要插入的元素放到最后,那么以前的内存指针自然就不可用了。特别是在和find等算法在一起使用的时候,牢记这个原则:不要使用过期的iterator
5,为何map和set不能像vector一样有个reserve函数来预分配数据?
map和set内部存储的不仅仅是元素本身,还包括元素的节点信息,所以不能用reserve函数来预分配数据
6,当数据元素增多时(10000和20000个比较),map和set的插入和搜索速度变化如何?
map和set中查找是使用二分查找,时间复杂度为logn,当元素增大时,插入和搜索速度并不会受到太多影响
- STL中关于map和set的一些问题
- STL中关于map和set的四个问题?
- STL中关于map和set的四个问题
- STL中关于map和set的四个问题?
- STL中关于map和set的四个问题?
- 关于STL中map的一些用法
- 数据结构::关于STL中map,set,muliset,multimap要说的
- STL 中map 和 set 的知识点总结
- STL 中map 和 set 的知识点总结
- sicily Message Flood STL中set和map的应用
- STL中map和set底层的红黑树实现
- 关于java中List、Set、Map的一些总结
- STL中Map和Set应用总结
- STL中map和set详解
- 【最近面试遇到的一些问题】java中list、set和map 的区别
- STL中set、map的比较函数
- STL中map,set的使用
- STL中map-set的使用
- datatables——数据
- svn服务器详细权限控制
- HDU 3949 XOR (第k小的异或值)
- 详细设计说明书编写规范
- 统计数学方法——kd树的构建,kd树的搜索
- STL中关于map和set的一些问题
- NSMutableArray从plist文件中初始化
- php如何上传文件名为中文的文件
- bundle install时报错Could not fetch specs from http://ruby.taobao.org/
- 延迟渲染的一些思考
- 将0,1,3,4,5,6等转化成0~1点,3点,4~6点
- Android之android studio如何把项目分享到github并提修改的代码到Github
- 在11g安装 XML DB 组件
- MFC里多文档多视图+多线程动态计算、绘制曲线