• 基本属性
与顺序容器的差别,按照关键字来保存和访问,而顺序容器是按照容器中的位置来顺序保存和访问。
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. MyEclipse 优化:之占用CPU过高100%

    原因是  jsp文件代码有4000行左右,MyEclipse打开jsp的时候会越来越慢.CPU占用会越来越高,因此,需要用别的编辑器打开jsp文件,不用在MyEclipse中编辑jsp文件. 我用的是 ...

  2. 玩vue+mockjs

    玩vue+mockjs vue中用mock制造模拟接口(本文主要解决坑),一定要看完哦 最近新入职一家公司,后端造接口速度很慢,想来想去还是搞一套模拟接口,来满足开发需求,有人会问,我造一个死数据不就 ...

  3. 使用JQuery反向选择checkbox

    HTML代码: <input id="haspda" type="checkbox" name="haspda" value=&quo ...

  4. Spring事务失效的原因

    http://blog.csdn.net/paincupid/article/details/51822599 Spring事务失效的原因 5种大的原因 如使用mysql且引擎是MyISAM,则事务会 ...

  5. python文件处理复习

    1.创建文件 >>> file('test.txt','w')   -->在当前路径下创建文件 test.txt是文件名 w是打开文件的方式,r是读,w是写,a是追加,如果当前 ...

  6. Using gcc stack debug skill

    The stack error is hard to debug, but we can debug it assisted by the tool provided by GCC. As we kn ...

  7. 2D Platformer 学习

    using UnityEngine; using System.Collections; /// <summary> /// 玩家控制 /// </summary> publi ...

  8. What happens to our code? JavaScript 代码是怎样执行的

    1. 我们的代码第一步会被parser 语法分析程序分析. 如果没有报错之后 2. 生产SyntaxTree, 我们的代码会转换成machine code 3. 最终 我们的代码会被运行出来. 下面的 ...

  9. Java Scanner学习记录

    1. Java.util.Scanner可以用来从键盘获取输入 Scanner.next()  只能读取字符,遇到任何的符合都不会输出 Scanner.nextLine()  会完全按照用户输入的st ...

  10. 配置B类内网 和 配置A类内网

    首先 A 类网 对应的 子网掩码是255.0.0.0 B 类网 对应的 子网掩码是255.255.0.0 C 类网 对应的 子网掩码是255.255.255.0 一般来说 10 开头的都是 A 类网  ...