条款1:仔细选择你的容器
来源:互联网 发布:阿里云客服报名入口 编辑:程序博客网 时间:2024/05/29 16:28
容器
分类:
标准STL序列容器:vector、string、deque 和list。
标准STL关联容器:set、multiset、map 和multimap。
非标准序列容器:slist和rope。
非标准关联容器:hash_set、hash_multiset、hash_map和hash_multimap。
标准非STL容器:数组、bitset、valarray、queue和priority_queue。
分类:
连续内存容器(也叫做基于数组的容器):在一个或多个(动态分配)的内存块中保存它们的元素。如果一个新元素被插入或删除已存在的元素,其他在同一个内存块的元素必须移动来腾出空间或是填充空间。影响效率和异常安全。
包括有:vector、string 和deque; rope
基于节点的容器:在每个内存块(动态分配)中只保存一个元素。元素的插入和删除只影响指针不影响内容,其他元素之不需要移动。
包括:list、slist 、set 、multiset 、map 、multimap
而非标准的散列容器使用不同的基于节点的实现
关于容器的选择问题:
- vector、list和deque之间的选择,vector可以作为一种默认使用的序列类型,当需要频繁对序列中部进行插入、删除操作是用list,当大部分的插入和删除发生在序列的头部或尾部是用deque。
- 需要在容器任意位置插入一个新元素,则选用序列容器。
- 需要考虑容器中元素的顺序时,应该避免使用散列容器。
插注:
五种迭代器:
输入迭代器和输出迭代器;
前向迭代器:所有标准STL容器都支持比前向迭代器更强大的迭代器;
双向迭代器:标准关联容器都提供双向迭代器,list也有。
随机访问迭代器:vector、string和deque都提供随机访问迭代器。指向数组的指针也可以作为数组的随机访问迭代器。 - 如果容器中的数据的内存布局需要兼容C,则只能用vector。
- 重视查找速度的话,容器的选择的优先级别应该是:散列容器>排序的vector>标准关联容器。
- 很多string的实现以及rope的实现是基于引用计数的。可以用vector代替string。
- 是否需要插入和删除的事务性语义。也就是是否需要可靠地回退插入和删除的能力,如果是,应选用基于节点的容器。如果需要多元素插入,选用list。
- 是否需要考虑把迭代器、指针和引用的失效次数减少到最低。如果是,应使用基于节点的容器,因为只要不指向你要删除的元素,在这些容器上插入和删除不会使迭代器、指针和引用失效。
- 当需要满足以下特性时:1)可以使用随机访问迭代器;2)只要没有删除而且插入只发生在容器结尾,指针和引用(这里,迭代器可能会失效,但是deque是唯一一个“在迭代器失效时不会使它的指针和引用失效”的标准STL容器)的数据就不会失效。应该选用deque。
—————————-整理自《Effective STL》
阅读全文
0 0
- 条款1:仔细选择你的容器
- 条款1:仔细选择你的容器
- 条款1:仔细选择你的容器
- 条款1:仔细选择你的容器
- Effective STL 条款1:仔细选择你的容器 (连载)
- effect stl 条款1 仔细选择你的容器
- Effective STL 条款1:仔细选择你的容器
- 仔细选择你的容器
- 仔细选择你的容器(STL)
- Effecective STL: 容器 (条款1: 小心选择你的容器)
- 学习Effective STL——仔细选择你的容器
- 仔细选择合适的STL容器
- 条款9:在删除选项中仔细选择
- 条款1:仔细区别Pointers和References
- 条款1:仔细区别pointers和references
- 基础议题 条款1:仔细区别pointer和reference
- 推荐你仔细品味的文章
- 为你的Android程序选择合适的数据容器
- C++中空类和空结构体大小的问题?
- Visual Studio 2015
- showlog监控慢日志查询以及源码分析笔记(12)
- powershell 斐波那契数列
- JS编程训练 | 题5:删除最后一个元素
- 条款1:仔细选择你的容器
- [cocos2d-x]关于菜单项
- IT之路-C语言入门-ZCSDN.2017.7.12
- 使用 numpy 和 PIL 进行简单的图像处理
- Django学习笔记6-启用管理后台
- caffe中数据层的参数含义
- Codeforces Round #423 (Div. 2) D High Load 贪心,树
- Spoon etl汉化
- Eclipse报java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter错误