迭代器。

基本介绍(来源于网络):迭代器是一种抽象的概念。能够遍历容器内的 部分/全部 元素。每个迭代器中包含着元素的地址。  它可以将 抽象容器 和 泛型算法 结合起来。
 
大致原理:
  1)迭代器对象 包含 容器内元素的地址。
  2)通过设计,将元素操作统一。
个人理解:
  1)迭代器的概念,有效整合不同容器和泛型算法。它提供了一个接口,用来操作容器内元素。
  2)通俗理解:他是STL库的信息接口。
  3)它要求所有操作应该有相同接口。
  4)容器需要提供自己的迭代器,使用泛型算法尽量使用迭代器。
一些细节:
  1)改变容器内元素的储存地址的操作,可能导致原有迭代器失效。间接说明,迭代器的本质是指针。
  2)尾后迭代器通常表示结束。
  3)迭代器不能使用 取地址符号’&‘ 来获取。
 
五类迭代器:一个真正的迭代器可以包含以下数种类型。
  1)输入/出迭代器:读取序列中的元素。需要支持以下几点:
    1,[ == ] [ != ],[ ++ ],[ * ],[ -> ]
  2)前向迭代器:单向移动。
  3)双向迭代器:双向移动
  4)随机访问迭代器:支持使用下标操作。

顺序容器。

通用概念。

  顺序容器基本理解:按照顺序储存元素,并提供 元素具体操作(迭代器或其他) 和 顺序访问元素 的能力。

  个人理解:

    1)顺序:按照添加的先后次序排序。但,先进优先,还是后进优先取决于具体容器。

  个人应用:

    1)在可以使用容器时,尽量使用容器。因为你无法保证自己的算法优于整个开发组。

    2)选择容器的基本原则(from C+ primer):

      1,在不知道如何选择时,使用vector。

      2,单个元素需求内存很小,内存紧缺时,不要使用list/forward_list。

      3,已知添加操作时,尽量使用符合 原设计思想 的容器。例如:频繁的随机插入/删除,使用list/forward_list,而尽量不使用vector,deque。

      4,举一反三:混合添加操作时,选择最频繁的添加操作,作为选择容器的标准。例如:100次后置添加 + 一次随机操作时,选择vector,deque。反之:list/forward_list。

      5,举一反三:添加操作在某些阶段存在统一,则可以进行容器替换。例如:输入元素使用 list。输入结束后,使用vector储存(copy list),再进行读取操作。

    3)尽量使用迭代器来操作容器——虽然有些容器支持下标。

vector容器:

  一些细节:

    1)使用连续内存保存元素。

    2)可以下标访问元素(速度快)。可是当作动态数组使用。

    3)中间添加/删除元素耗时。因,需要重新调整内存。同时会导致迭代器失效(大概率)。

    4)添加新元素时(push_back),也可能重新分配内存。导致迭代器失效(中概率)。

    5)容器存在增长方式:超出时,按照一定量增加内存,以保证添加数个元素后,才需要再次分配内存。量值可通过函数设定(不建议)。

deque容器:

  一些细节:

    1)使用连续内存保存元素。

    2)不确定是否可以使用下标访问。

list容器:双向链表。

  一些细节:

    1)使用链表的思想。

    2)额外内存开销相对较大。

    3)不支持下标。

forward_list容器:

  一些细节:

    1)和list容器类似。

    2)主要特征:单向链表。

array容器:

  一些细节:

    1)对数组的封装。加强安全性。

    2)有数组的特性。

string容器:

  一些细节:

    1)使用连续内存保存元素。

    2)用来保存字符串。

适配器:

  概念:一个适配器是一种机制。通过适配器,可以使容器从行为上模仿其他数据结构。

  顺序容器可用适配器:stack, queue, priority_queue。

  个人理解:用来模拟一些通用的数据结构。如上:堆栈,队列。

  疑惑:为何不直接做成容器?

无序容器。

基本常识:

  1)主要为:map 和 set。衍生型:multi和unorder.例如:multimap, unorder_multimap.

  2)使用pair作为单位元素。

    1,key-value组成一个pair.

    2,first成员:key。second成员:value。

    3,key为const类型不可改变。

  3)关联容器的构成:key-pair.

基本要点:

  1)通常不对关联容器使用 泛型算法。

  2)有序关联容器,有 严格弱序 的要求。默认使用 [<=]。当然,也可以使用谓词或lambda表达式来自定义。

C++ 常见容器的更多相关文章

  1. C++ STL中常见容器的时间复杂度和比较和分析

    C++ STL中常见容器的时间复杂度 map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O( ...

  2. 几种常见 容器 比较和分析 hashmap, map, vector, list ...hash table

    list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的.  如果我自己写,我也会用二叉检索树,它在 ...

  3. [转] C++的STL库,vector sort排序时间复杂度 及常见容器比较

    http://www.169it.com/article/3215620760.html http://www.cnblogs.com/sharpfeng/archive/2012/09/18/269 ...

  4. STL 常见容器

    vector: 是一种在结尾处高效插入.删除的容器,本质上是一个动态数组,可以自动维护数组的空间分配.它也允许在开头和中间插入.删除数据,但是效率极低. <span style="fo ...

  5. 【转】C++ STL中常见容器的时间复杂度

    map, set, multimap, and multiset 上述四种容器采用红黑树实现,红黑树是平衡二叉树的一种.不同操作的时间复杂度近似为: 插入: O(logN) 查看:O(logN) 删除 ...

  6. C++中使用sort对常见容器排序

    本文主要解决以下问题 STL中sort的使用方法 使用sort对vector的排序 使用sort对map排序 使用sort对list排序 STL中sort的使用方法 C++ STL 标准库中的 sor ...

  7. python常见容器属性和方法

    `````字符串中反斜杠字符表 转义格式    意义 \'  单引号(') \"  双引号(") \\  反斜杠(\ ) \n  换行 \r  返回光标至行首 \f  换页 \t ...

  8. kotlin基础 常见容器的取值范围

  9. JDK里常见容器总结

    自己总结.   扩容 线程安全   是否支持null 的key 说明 hashmap 2*length 否   是 1.8以后增加红黑树.提高检索效率 hashtable   是   否 官方不建议使 ...

随机推荐

  1. uva 508 Morse Mismatches

    Samuel F. B. Morse is best known for the coding scheme that carries his name. Morse code is still us ...

  2. h5 如何打包apk

    1.需要下载安装MyEclipse2014,Android SDK,eclipse(需配置Android开发环境) Java和Android环境安装与配置. 2.打开MyEclipse2014,新建一 ...

  3. python的时间模块

    python有两个重要的时间模块,分别是time和datetime 先看time模块 表示时间的几种方法: 1)时间元组:time.struct_time(tm_year=2016,   tm_mon ...

  4. gcc编译通过,运行却显示“段错误”的解决方法

    ​第一次在Liunx上(liunx mint 17)使用gcc编译c文件,竟然提示“找不到stdio.h",经过google后发现执行 sudo apt-get install build- ...

  5. C语言IO操作总结

    C语言IO操作总结C程序将输入看做字节流,流的来源是文件.输入设备.或者另一程序的输入:C程序将输出也看做字节流:流的目的是文件.视频显示等: 文件处理:1 :fopen("filename ...

  6. Qt wrappers for OS X Cocoa widgets

    Qt wrappers for OS X Cocoa widgetshttps://github.com/MikeMcQuaid/Qocoa

  7. 线程池之ThreadPool类与辅助线程 - <第二篇>

    一.CLR线程池 管理线程开销最好的方式: 尽量少的创建线程并且能将线程反复利用(线程池初始化时没有线程,有程序请求线程则创建线程): 最好不要销毁而是挂起线程达到避免性能损失(线程池创建的线程完成任 ...

  8. XmlDocument,XDocument相互转换

    XmlDocument,XDocument相互转换 using System; using System.Xml; using System.Xml.Linq; namespace MyTest { ...

  9. Android高德地图开发具体解释

    这段时间开发的时候用到了高德地图,对高德地图开发有心得体会,如今分享给大家.对我开发过百度地图的我来说,整体来说高德地图Demo,没有百度解说的具体 个人更偏向于使用百度地图,可是没办发,项目须要使用 ...

  10. 如何导出sqlserver中的表数据,sqlserver2008

    sqlserver数据库中的表数据,我们通常想使用一下,可是怎样获取这些数据呢? 1.选择任务->生成脚本 2.选择数据库 3.设置配置,让编写数据的脚本为true 4.保存为sql 5.完成 ...