Effective_STL 学习笔记(一)仔细选择你的容器
本章关注的是可以适合所有STL容器的指导方针:
选择适当容器时应该面对的约束;
避免产生为一个容器类型写的代码也可以用于其他容器类型的错觉;
容器里对象拷贝操作的重要性;
当指针或auto_ptr存放在容器中时出现的难点;
删除输入和输出;
可不可以使用自定义分配器;
达到最高效率的技巧和考虑在多线程环境下容器的使用
C++容器回顾:
标准STL序列容器:vector、string、deque和list;
标准STL关联容器:set、multiset、map和multimap;
非标准容器序列slist和rope。slist是一个单向链表,rope本质是一个重型字符串;
非标注关联容器:hash_set、hash_multiset、hash_map和hash_multimap;
vector<char> 可以作为string的替代品;
vector 作为标准关联容器的替代品;
几种标准非STL容器:数组、bitset、valarray、stack、queue和priority_queue
vector、deque 和 list 之间做选择的指导方案:
根据复杂度,vector 是一种可以默认使用的序列类型;
当频繁的对序列中部进行插入和删除时应该使用 list;
当大部分插入和删除发生在序列的头部和尾部时可以选择 deque;
连续内存容器和基于节点的容器的区别:
连续内存容器(也叫作基于数组的容器)在一个或多个(动态分配)的内存块中保存他们的元素:
vector、string 和 deque
基于节点的容器在每个内存块(动态分配)中只保存一个元素:
list 和 slist,所有标准关联容器也是(典型实现是平衡树)
大多数关于容器间选择问题:
1. 可以在容器的任意位置插入一个新元素,则需要序列容器,关联容器做不到;
2. 不关心元素在容器中的顺序,散列容器可行,否则避免使用散列容器;
3. 必须使用C++标准容器时,可以除去散列容器、slist 和 rope;
4. 考虑迭代器,如果必须是随机访问迭代器,只限于 vector、deque 和 string,也可考虑 rope;
5. 当插入和删除数据时,如果非常在意容器内的元素移动,则放弃使用内存连续容器;
6. 容器中的数据的内存需要兼容 C 时,只能使用 vector;
7. 查找速度很重要时,多考虑散列容器,排序的 vector 和标准的关联容器;
8. 如果介意容器底层使用引用计数,则避开 string、rope,可以考虑使用 vector<char>;
9. 如果需要插入和删除的事务性语义,则需要使用基于节点的容器,list 是唯一提供多元素插入事务性语义的标准容器;
10. 如果需要把迭代器、指针和引用的失效次数减到最少,使用基于节点的额容器;
11. 可以随机访问迭代器,只要没有删除且插入只发生在容器的结尾,使用 deque;
转载于:https://www.cnblogs.com/kidycharon/p/9993285.html
Effective_STL 学习笔记(一)仔细选择你的容器相关推荐
- Effective_STL 学习笔记(二)小心对 “容器无关代码” 的幻想
STL 是建立在泛化上的,数组泛化为容器,参数化了所包含的对象的类型.函数泛化为算法,参数化了所用的迭代器类型.指针泛化为迭代器,参数化了所指向对象的类型. 泛化继续,独立的容器类型泛化为序列或关联容 ...
- QT学习笔记(八):顺序容器和关联容器
QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...
- QT学习笔记(九):遍历容器-迭代器(iterators)
QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...
- golang学习笔记之--Go语言内建容器
话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...
- 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)
文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...
- Effective_STL 学习笔记(九) 在删除选项中仔细选择
去除一个容器中有特定值的所有对象: 如果容器是 vector.string 或 deque,使用 erase-remove惯用法 c.erase( remove( c.begin(), c.end() ...
- Effective_STL 学习笔记(三十一) 了解你的排序选择
排序出 20 个质量最高的 Widget,一种算法叫作 partial_sort: 1 bool qualityCompare( const Widget & lhs, const Widge ...
- 《算法笔记》学习笔记——2.3选择结构
前言 为准备大四华为笔试,决定使用学长推荐的<算法笔记>一书来学习,配套有<算法笔记·上机训练实战指南>,希望学习完此书,刷完力扣,能够通过笔试,为拿到大厂offer奠定基础
- IBatis.Net学习笔记九--动态选择Dao的设计分析
在IBatis.Net中可以通过配置文件动态选择数据库.动态选择Dao对象. Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式.Ado的方式.NHibernet的方式 ...
最新文章
- axi dma 常见的中断报错源码
- VC++ .Net 实例学习
- java mvc ef_一个简单MVC5 + EF6示例分享
- 云漫圈 | 我觉得我的手机被监听了。。。
- 小程序路由及路由传参
- SAP License:GR/IR
- Siri在苹果继续活着、蠢着、没落着,现在它最后一个创始人也走了
- java hibernate状态_Hibernate对象的三种状态
- wmv格式转html格式转换器,iPixSoft SWF to HTML5 Converter
- R语言 MCMC算法及其实现
- 自学单片机能找到工作吗?能有出路吗?
- unity android ios9,Unity For Android iOS 的本地推送
- 阿里云Aliplayer视频播放2(断点续播--根据上次播放记录实现续播功能)
- 标题您的主机不满足在启用 Hyper-V 或 Device/Credential Guard 的情况下运行 VMware Workstation 的最低要求
- 微信支付-小程序支付全流程
- 前端模糊匹配方式,前端正则模糊匹配
- mac时间机器文件服务器,Mac小技巧:时间机器的使用方法和细节
- 经济法基础——第三章第一节、支付结算概述
- Unicode对汉字的编码
- 基于计算机视觉的食物新鲜度分级检测