本章关注的是可以适合所有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 学习笔记(一)仔细选择你的容器相关推荐

  1. Effective_STL 学习笔记(二)小心对 “容器无关代码” 的幻想

    STL 是建立在泛化上的,数组泛化为容器,参数化了所包含的对象的类型.函数泛化为算法,参数化了所用的迭代器类型.指针泛化为迭代器,参数化了所指向对象的类型. 泛化继续,独立的容器类型泛化为序列或关联容 ...

  2. QT学习笔记(八):顺序容器和关联容器

    QT学习笔记(八):顺序容器和关联容器 一.前言 二.容器介绍 2.1 顺序容器 2.2 关联容器 二.顺序容器示例 三.关联容器 一.前言 在Qt库中为我们提供了一系列的基于模板的容器类(conta ...

  3. QT学习笔记(九):遍历容器-迭代器(iterators)

    QT学习笔记(九):遍历容器-迭代器(iterators) 遍历容器 : 1.Jave风格: 2.STL风格: 3.foreach 关键字: 遍历容器 : 遍历一个容器可以使用迭代器(iterator ...

  4. golang学习笔记之--Go语言内建容器

    话接上文 <golang学习笔记之--Go语言基本语法> 今天继续记录学习笔记,今天的笔记主题是Go语言内建容器 如果各位童鞋想要获得下面的源码,请搜索gzh:隔壁王小猿,关注后回复&qu ...

  5. 【C++ STL学习笔记】C++ STL序列式容器(array,vector,deque,list)

    文章目录 C++ STL容器是什么? 迭代器是什么,C++ STL迭代器(iterator)用法详解 迭代器类别 迭代器的定义方式 C++序列式容器(STL序列式容器)是什么 容器中常见的函数成员 C ...

  6. Effective_STL 学习笔记(九) 在删除选项中仔细选择

    去除一个容器中有特定值的所有对象: 如果容器是 vector.string 或 deque,使用 erase-remove惯用法 c.erase( remove( c.begin(), c.end() ...

  7. Effective_STL 学习笔记(三十一) 了解你的排序选择

    排序出 20 个质量最高的 Widget,一种算法叫作 partial_sort: 1 bool qualityCompare( const Widget & lhs, const Widge ...

  8. 《算法笔记》学习笔记——2.3选择结构

    前言  为准备大四华为笔试,决定使用学长推荐的<算法笔记>一书来学习,配套有<算法笔记·上机训练实战指南>,希望学习完此书,刷完力扣,能够通过笔试,为拿到大厂offer奠定基础

  9. IBatis.Net学习笔记九--动态选择Dao的设计分析

    在IBatis.Net中可以通过配置文件动态选择数据库.动态选择Dao对象. Dao对象也就是操作数据库的类,通过配置文件我们可以选择DataMapper的方式.Ado的方式.NHibernet的方式 ...

最新文章

  1. axi dma 常见的中断报错源码
  2. VC++ .Net 实例学习
  3. java mvc ef_一个简单MVC5 + EF6示例分享
  4. 云漫圈 | 我觉得我的手机被监听了。。。
  5. 小程序路由及路由传参
  6. SAP License:GR/IR
  7. Siri在苹果继续活着、蠢着、没落着,现在它最后一个创始人也走了
  8. java hibernate状态_Hibernate对象的三种状态
  9. wmv格式转html格式转换器,iPixSoft SWF to HTML5 Converter
  10. R语言 MCMC算法及其实现
  11. 自学单片机能找到工作吗?能有出路吗?
  12. unity android ios9,Unity For Android iOS 的本地推送
  13. 阿里云Aliplayer视频播放2(断点续播--根据上次播放记录实现续播功能)
  14. 标题您的主机不满足在启用 Hyper-V 或 Device/Credential Guard 的情况下运行 VMware Workstation 的最低要求
  15. 微信支付-小程序支付全流程
  16. 前端模糊匹配方式,前端正则模糊匹配
  17. mac时间机器文件服务器,Mac小技巧:时间机器的使用方法和细节
  18. 经济法基础——第三章第一节、支付结算概述
  19. Unicode对汉字的编码
  20. 基于计算机视觉的食物新鲜度分级检测

热门文章

  1. iWatch 开发 2:创建一个简单的Apple watch应用
  2. Pytorch中的梯度回传
  3. 一个服务器启动2套mysql_一台服务器上启动两个mysql实例
  4. keil修改 Pack Installer 路径
  5. php判断文本不存在,nginx 判断访问文件或目录不存在rewrite
  6. Rancher server 管理员密码重置
  7. 惠普大中华区总裁退休感言
  8. MDT2013系列之一 MDT 2013 Update 1安装和部署
  9. 关于电源纹波的那些硬核内容都在这里了!
  10. 实际问题中提出一个检验统计量,如何确定其分布?