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

  • 算法

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

    D:合影效果 查看 提交 统计 提问 总时间限制:  1000ms 内存限制:  65536kB 描述 小云和朋友们去爬香山,为美丽的景色所陶醉,想合影留念.如果他们站成一排,男生全部在左(从拍照者的 ...

  2. [LeetCode&Python] Problem 860. Convert BST to Greater Tree

    Given a Binary Search Tree (BST), convert it to a Greater Tree such that every key of the original B ...

  3. sudo: sorry, you must have a tty to run sudo

    使用ssh进行无密访问,并发送执行命令的时候遇到了如题的错误 执行命令ssh user@host "sudo rm /data/test,txt" sudo: sorry, you ...

  4. 对于vs出现“This function or variable may be unsafe”

    1.项目上右击选择“属性” 2.选择C/C++ ->预处理器 ->预处理器定义 3.添加一行  _CRT_SECURE_NO_WARNINGS 4.点击确定,重新编译成功.

  5. AE旋转

    精准对位: 好几个图层上的旋转点在一个位置上: 方法1:勾选网格,定点. 方法2:按住ctrl+r  调出尺寸.拖参考线,焦点自动吸附功能. 选中四张或者选中第一张,按shift键,选中最后一张(即可 ...

  6. 20155208徐子涵 2016-2017-2 《Java程序设计》第10周学习总结

    #### **教材学习总结**网络编程 网络编程就是在两个或两个以上的设备(例如计算机)之间传输数据.程序员所作的事情就是把数据发送到指定的位置,或者接收到指定的数据,这个就是狭义的网络编程范畴. * ...

  7. Redis(三)源source编译

    背景: 自己电脑是win7 32bit的,而想要Redis4.0的版本,但是在网上没找到,所以自己干脆download源source,自己build,安装. 最后,目前达到的状态是,windows下s ...

  8. itcast-spring

    黑马2014  spring后期 ssh整合后期  讲解不清楚 源码讲解太多   spring重新开始  itcast2016版本 介绍 Spring搭建 约束引入注意事项 导入至eclipse:wi ...

  9. 如何取消noarch.rpm包

    有一次部署zabbix服务器,不小心rpm -ivh zabbix的el7版本的rpm了,但是我的系统是centos6.5的,所以就尴尬了 rpm -ivh http://repo.zabbix.co ...

  10. Distributed Phoenix Chat with PubSub PG2 adapter

    转自:https://www.poeticoding.com/distributed-phoenix-chat-with-pubsub-pg2-adapter/ In this article we’ ...