迭代器。

基本介绍(来源于网络):迭代器是一种抽象的概念。能够遍历容器内的 部分/全部 元素。每个迭代器中包含着元素的地址。  它可以将 抽象容器 和 泛型算法 结合起来。
 
大致原理:
  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. Kernel Regression from Nando's Deep Learning lecture 5

    require 'torch' require 'gnuplot' , , nData) ) print(xTrain) print(yTrain) local yTrain = yTrain + t ...

  2. SQL基础-->层次化查询(START BY ... CONNECT BY PRIOR)[转]

    --====================================================== --SQL基础-->层次化查询(START BY ... CONNECT BY ...

  3. CentOS 安装redis2.8.13 提醒"libc.so.6: version `GLIBC_2.14' not found"系统的glibc版本太低

    以下在系统CentOS 6.3 x86_64上操作 1.试图运行程序,提示"libc.so.6: version `GLIBC_2.14' not found",原因是系统的gli ...

  4. HTML5简单入门系列(二)

    前言 上篇中写到HTML5中的画布(canvas)元素,查看了canvas其他的资料,发现这个元素相关内容太多,鉴于本系列只是基础(主要是LZ也是初学),不再做太多介绍,有机会的话再单独写相关内容.说 ...

  5. Spring连接MySQL、Oracle和SQL Server的数据库运动连接属性

    在配置文件applicationContext.xml设置如下:<?xml version="1.0" encoding="UTF-8"?>< ...

  6. win8系统intellij输入中文问题

    用上新的intellij,不过在输入汉字时出现后面的被删除,网上找了,没有找到解决方案,只有自己解决了,感觉如果是intellij不兼容win8,那么就不能用intellij,那对于习惯了intell ...

  7. JSONP跨域的原理

    一种脚本注入行为 在 2011年10月27日 那天写的     已经有 12671 次阅读了 感谢 参考或原文   服务器君一共花费了23.005 ms进行了2次数据库查询,努力地为您提供了这个页面. ...

  8. 【待整理】IOS开发之下载

    一.传统的下载文件的方式 - (void)downloaderWithUrl:(NSURL *)url { NSURLRequest *request = [NSURLRequest requestW ...

  9. DES、AES、TEA加密算法的比较

    1.     DES算法介绍: DES算法具有对称性, 既可以用于加密又可以用于解密.对称性带来的一个很大的好处在于硬件实现, DES 的加密和解密可以用完全相同的硬件来实现.DES 算法的明文分组是 ...

  10. Qt之窗口动画(下坠、抖动、透明度)(还有好多相关帖子)

    简述 前面几节中我们介绍了关于动画的基本使用,有属性动画.串行动画组.并行动画组.这节我们来实现一些特效,让交互更顺畅. 简述 示例 效果 源码 更多参考 示例 下面,我们以geometry.pos. ...