• 基本属性
与顺序容器的差别,按照关键字来保存和访问,而顺序容器是按照容器中的位置来顺序保存和访问。
map:每个元素是一对键值(key-valye)组合;set每个元素只包含关键字。。
每个根据关键字是否可以重复分成两类,又根据关键字是否有序保存分成两类。 map通过关键字而不是位置来访问
set 只想知道一个值是否存在时,set最有用。 map 经典例子—单词计数器
set 想忽略常见单词,用set保存想要忽略的单词。
  • 操作
关联容器支持普通与位置无关的操作,不支持构造函数或插入操作这些接收一个元素值和一个数量值的操作。
关联容器还支持一些顺序容器不支持的操作和类型别名。此外,无序容器还提供一些调整哈希性能的操作。
关联容器的迭代器都是双向的。 关联容器的关键字类型必须定义比较的方法,默认使用<运算符。
传递给排序算法的可调用对象,必须满足与关联容器中关键字一样的类型要求。
关键字类型上定义一个严格弱序。
自定义的关键字比较操作比较在尖括号中紧跟着元素类型给出。比较操作类型应该是一种函数指针。 pair的构造函数默认对数据成员进行值初始化。其数据成员是public的,两个成员分别命名为first和second。
初始化方式 p (v1, v2) p={v1, v2} make_pair(v1, v2)
  • 类型别名

    • key_type
    • mapped_type
    • value_type 对set等于key_type;对map,pair<const key_type, mapped_type>

    map的key也是const的

    set的迭代器是const的

  • 算法

通常不对关联容器使用泛型算法,可用于只读取元素的算法。
但很多这类算法会用到搜索序列,由于不能通过关键字进行快速查找,所有使用泛型算法几乎总是个坏主意。
实际编程中真要对关联容器使用算法,要么将它当做一个源序列,要么作为一个目的位置。 关联容器insert返回一个pair,包含一个指向具有指定关键字的元素,和一个指示插入是否成功的bool值。
对于允许重复关键字的关联容器,insert操作返回一个指向新元素的迭代器,无需返回一个bool值。 3个版本的erase 非const的map和无序map可以使用下标,如关键字不存在会创建一个元素。
c.at(k) 访问关键词为k的元素,若k不在c中,抛出out_of_range异常。
以上两个返回的是mapped_type,而解引用返回的是value_type
  • 访问元素
find(k)查找元素是否存在,返回指向第一个关键字为k元素的迭代器,不存在则尾后
cout(k) 计数 返回关键字等于k的元素的数量
lower_bound(k) 返回一个迭代器,指向第一个关键字不小于k的元素
upper_bound(k) 返回一个迭代器,指向第一个关键字大于k的元素
equal_range(k) 返回一个迭代器pair,表示关键字等于k的元素的范围。不存在则pair两个成员都为end() 1以count和find配合遍历所有关键字为k的元素
2可以lower_bound和upper_bound配合获得所有元素的范围。如关键字不在容器中,lower_bound会返回第一个安全插入点,不影响容器中元素顺序的插入位置
3 qual_range 本质上跟第二种一样。
  • 无序容器
    - 不是通过比较运算符来组织元素,而是使用hash函数和关键字类型的==运算符
- 在关键字没有明显的序关系的情况下,无序容器是很有用的。或者在某些应用场合维护元素的序的代价非常高贵,此时无序容器也是很有用的。 - 理论上hash技术能获得更好地平均性能,但要达到需要性能测试和调优工作。通常使用无序容器更为简单。
  • 管理桶

    • 无序容器的性能依赖于哈希函数的质量和桶的数量大小。
无序容器管理操作
c.bucket_count() 正在使用的桶的数量
c.max_bucket_count() 容器能容纳的最多的桶的数量
c.bucket_size(n) 第n个桶中有多少个元素
c.bucket(k) 关键字为k的元素在哪个桶中
桶迭代
local_iterator 可以访问桶中元素迭代器的类型
const_local_iterator const版本
c.begin(n), c.end(n)
c.cbegin(n), c.cend(n)
哈希策略
c.load_factor() 每个桶的平均元素数量,返回float
c.max_load_factor() c试图维护的平均桶大小,在需要时会添加新桶
c.rehash(n) 重组存储,桶数>=n且>size/max_load_factor
c.reserve(n) 重组存储,使得c可以保存n个元素且不必rehash

自定义类类型的无序容器,必须提供自己版本的hash模板版本,还有比较函数(或==)

  • 二叉树

    • 如果平衡,搜索性能逼近二分查找。相比连续内存空间的二分查找优点是,增删时不需要移动大段的内存数据,甚至通常是常数开销。实际使用的二叉树加上平衡算法。

  • 红黑树

    • 子女个数可以有多个,主要减少io的次数,减小树的层数,同时解决平衡问题,保证至少半满。
    • 性能等价与二分查找

  • B+树

    • 内部节点并没有指向具体数据的指针,同一个盘块中可以容纳更多的关键字数量,一次性读入内存的关键字就更多,IO读写次数就降低了。
    • 指针指向一个半开区间 [ ),叶子节点之间增加指针,方便遍历或范围查找。
    • 所有数据都保存在叶子节点中,保证每次搜索都花费相同的时间,查询效率更稳定。
    • 所有关键字都出现在链表中(稠密索引),非叶子节点相当于是叶子节点的索引(稀疏索引),叶子节点相当于是存储数据的数据层。

  • B*树

    • 至少2/3满,提高块利用率。
    • B+树分裂只影响到原结点和父结点,故不需要兄弟指针
    • 分配新节点的概率低。

  • R树

    • 高维空间的搜索问题,把B树的思想扩展到了多维空间。
    • 最小边界矩阵进行空间分割。
    • 最佳应用范围是2到6维,更高维的存储会变得非常复杂。
    • 变体R*树。

C/C++基础----关联容器的更多相关文章

  1. C++学习基础四——顺序容器和关联容器

    —顺序容器:vector,list,queue1.顺序容器的常见用法: #include <vector> #include <list> #include <queue ...

  2. C++基础之关联容器

    关联容器 关联容器和顺序容器的本质区别:关联容器是通过键存取和读取元素.顺序容器通过元素在容器中的位置顺序存储和访问元素.因此,关联容器不提供front.push_front.pop_front.ba ...

  3. c++基础(五)——关联容器

    1.关联容器 关联容器中的元素时按照关键字来保存和访问的,与之相对的,顺序容器中的元素时按它们在容器中的位置来顺序保存和访问的.两个主要关联容器是 map 和 set.标准库提供了8个关联容器,这8个 ...

  4. stl中顺序性容器,关联容器两者粗略解释

    什么是容器 首先,我们必须理解一下什么是容器,在C++ 中容器被定义为:在数据存储上,有一种对象类型,它可以持有其它对象或指向其它对像的指针,这种对象类型就叫做容器.很简单,容器就是保存其它对象的对象 ...

  5. c++的关联容器入门(map and set)

    目录 std::map std::set C++的关联容器主要是两大类map和set 我们知道谈到C++容器时,我们会说到 顺序容器(Sequence containers),关联容器(Associa ...

  6. STL之关联容器

    关联容器包含map.set.multimap.multiset. 关联容器的特点是明显的,相对于顺序容器,有如下特点: 1.其内部是采用非线性的二叉树结构,具体的说是红黑树的结构原理实现的. 2.se ...

  7. STL_关联容器 VS C++ hashmap

    红黑树和哈希表区别: http://m.blog.csdn.net/article/details?id=52133283 关于STL中关联容器的几个问题: (1)为何map和set的插入删除效率比用 ...

  8. C++ 关联容器

    <C++ Primer 4th>读书笔记 关联容器和顺序容器的本质差别在于:关联容器通过键(key)存储和读取元素,而顺序容器则通过元素在容器中的位置顺序存储和访问元素. 关联容器(Ass ...

  9. C++ Primer : 第十一章 : 关联容器之关联容器的迭代器和操作

    关联容器的操作 除了和顺序容器定义的类型之外,关联容器还定义了一下几种类型: 关联容器额外的类型别名  key_type    此容器类型的关键字类型 mapped_type  每个关键字关联的类型, ...

随机推荐

  1. 搜索入门_简单搜索bfs dfs大杂烩

    dfs题大杂烩 棋盘问题  POJ - 1321 和经典的八皇后问题一样.  给你一个棋盘,只有#区域可以放棋子,同时同一行和同一列只能有一个棋子. 问你放k个棋子有多少种方案. 很明显,这是搜索题. ...

  2. Contest1036 - 2017西安电子科技大学程序设计新生赛网络预选赛

    一名大三older 希望能帮助大一萌新...加油 xiandianer!!!!; xdoj 1260 (B) 水题 用了一下STL (好长啊...) #include<iostream> ...

  3. P1373 小a和uim之大逃离(动态规划)

    题目链接:传送门 题目大意: 一个N行M列的矩阵,从任意点开始往右或者往下走,每走一格获得所到达的格子的分数. 要求总步数必须为偶数.问有多少种走法,使得奇数步得到的总分和偶数步得到的总分对K+1取模 ...

  4. 重写ajax方法实现请求session过期时跳转登录页面

    jQuery(function($){ var _ajax=$.ajax; // 备份jquery的ajax方法 $.ajax=function(opt){ var _success = opt &a ...

  5. windows server 2008 R2 部署NFS,实现多台服务器间、客户端间的共享目录。

    如何通过Windows Server 2008 R2建立NFS存储服务? 通过Windows Server 2008 R2,我们可以很容易地将其作为一台NFS存储服务器,得到一个NFS软存储,轻松解决 ...

  6. HTML中嵌套的子frame如何访问父页面中的函数?

    我解决的办法,在父页面写了个函数,然后在frame页面调用父页面的函数,具体代码如下: 父:function a(){} 子frame:window.parent.a(); 问题迎刃而解 https: ...

  7. java 编译 运行 及 引用外部 jar 包的方法

    1. 环境变量配置 JAVA_HOMEC:\Program Files\Java\jdk1.8.0_121; PATH%PATH%;C:\Java\jdk1.6.0_30\bin; CLASSPATH ...

  8. 对中文进行MD5加密的注意事项(Java版,编码问题)

    http://blog.csdn.net/tongdao/article/details/20690187 在工作中需要和第三方进行Http通信,在通信内容中有几个参数涉及到了中文.自己在进行MD5加 ...

  9. 【liunx】linux后台执行命令:&和nohup

    当我们在终端或控制台工作时,可能不希望由于运行一个作业而占住了屏幕,因为可能还有更重要的事情要做,比如阅读电子邮件.对于密集访问磁盘的进程,我们更希望它能够在每天的非负荷高峰时间段运行(例如凌晨).为 ...

  10. CH3B16 魔法珠

    题意 3B16 魔法珠 0x3B「数学知识」练习 描述 Freda和rainbow是超自然之界学校(Preternatural Kingdom University,简称PKU)魔法学院的学生.为了展 ...