二、C++、STL标准模板库和泛型编程 ——关联式容器 (侯捷)

侯捷 C++八部曲笔记汇总 - - - 持续更新 ! ! !
一、C++ 面向对象高级开发
1、C++面向对象高级编程(上)
2、C++面向对象高级编程(下)
二、STL 标准库和泛型编程
1、分配器、序列式容器
2、关联式容器
3、迭代器、 算法、仿函数
4、适配器、补充
三、C++ 设计模式
四、C++ 新标准
五、C++ 内存管理机制
六、C++ 程序的生前和死后

二、C++、STL标准模板库和泛型编程——关联式容器 (侯捷)

C++、STL标准模板库和泛型编程——序列式容器 (侯捷)

关联式容器

关联式容器,通过key来找值,查找速度非常快,可以看成是小型数据库。

关联容器:setmultisetmapmultimap,实现是使用 红黑树(高度平衡二叉树)

  • setkey既是key也是value

在这里插入图片描述
C++11中有Unordered容器,但他也属于关联容器,实现使用hash table做的

在这里插入图片描述

rb_tree 容器

Red-Black tree(红黑树)是平衡二叉搜索树balanced binary search tree)中常被使用的一种。平衡二叉搜索树的特征:排列规则有利searchinsert,并保持适度平衡——无任何节点太深。

在这里插入图片描述

rb_tree 提供“遍历”操作及iterators.

  • 按正常规则(++ite)遍历。便能获得排序状态sorted)。

我们不应使用rb_treeiterators改变元素值(因为元素有其严谨排序规则)。编程层面(programming leve并未阻止此事

  • 如此设计是正确的,因为rb_tree即将为setmap服务(作为其底层支持);
  • map允许元素的data被改变,只有元素的key才是不可以改变的。
  • rb_tree提供两个insertion操作:insert_unique()insert_equal()。前者表示节点的key一定是在整个tree中独一无二,否则安插失败(对红黑树没有任何影响);后者表示节点的key可以重复。

使用红黑树,有5个模板参数:

在这里插入图片描述
红黑树和双向链表都有一个不用的节点,双向链表是end后面的节点,红黑树是头节点。

第三个模板参数是指定如何取出key:

在这里插入图片描述

set、multiset 容器

set/multisetrb_tree为底层结构,因此有【元素自动排序】特性。

  • 排序的依据是key,而set/multiset元素的valuekey合一:value就是key
  • set/multiset提供“遍历”操作及iterators;按正常规则(++ite)遍历,便能获得排序状态(sorted)。
  • 我们无法使用set/multisetiterators改变元素值(因为key有其严谨的排序规则)。set/multisetiterators是其底部的RB_treeconst-iterator,就是为了禁止user对元素赋值。
  • set元素的key必须独一无二,因此其insert()用的是rb_treeinsert_unique()
  • multiset元素的key可以重复,因此其insert()用的是rb_treeinsert_equal()

在这里插入图片描述
在这里插入图片描述
multimap

multiset<int> c;
c.insert(2);//会放在该放置的位置,放进去就会被排序
c.begin();
c.end();
c.size();
c.max_size();
c.find(target);//内置find,红黑树

map、multimap容器

map/multimaprb_tree为底层结构,因此有【元素自动排序】特性。

  • 排序的依据是key
  • map/multimap提供“遍历”操作及iterators;按正常规则(++ite)遍历,便能获得排序状态(sorted)。
  • 我们无法使用map/multimapiterators改变元素的key(因为key有其严谨的排序规则)。但可以用它来改变元素的data。因此map/multimap内部自动将user指定的key type设定为const,如此便能禁止user对元素的key赋值。
  • map元素的key必须独一无二,因此其insert()用的是rb_treeinsert_unique()
  • multimap元素的key可以重复,因此其insert()用的是rb_treeinsert_equal()

在这里插入图片描述
在这里插入图片描述

map可以通过下标[]来插入:

在这里插入图片描述

hashtable 容器

C++11中有Unordered容器,但他也属于关联容器,实现使用hashtable做的 !

在这里插入图片描述

使用hash表,碰撞冲突采用拉链表法.

如果元素的个数超过bucket(篮子)的个数,就会扩充bucket的个数,变为当前bucket大小的两倍附近的质数,然后每个元素rehashing,插入。这是一条经验法则。

需要指定6个模板参数!ExtractKey 是放入的 ObjectKeyEqualKey 是比较函数,sizeof(hashtable)=20
在这里插入图片描述

使用 hashtable 最困难的事决定使用什么HashFcn(HashFcn怎么设计没人教)。

具体写一个使用hashtable的例子:

在这里插入图片描述
在这里插入图片描述

标准库没有提供现成C++的字符串即hash<std::string>,下面是C风格的字符串:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

注:个人学习笔记,如有不足,欢迎指正!

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的懒虫

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值