C++ STL第三周笔记

1.容器deque
容器deque的实现原理:deque两端都可以进出元素,而且它是“连续”存储的,它的实现原理图如下图。可以看到deque由这几部分构成:map(控制中心,实际上是vector类型),start(迭代器),finish(迭代器)。其中两个迭代器中均包含四个元素:以start迭代器为例。其中cur(指向当前元素的指针),first(指向这片缓存区的第一个缓存块),last(指向这片缓存区的最后一个缓存块),node(当前缓存区在控制中心的地址,也就是控制中心的首地址);deque容器不是真正意义上的连续存储容器,map中的每一个元素都指向一个缓存区,每当deque进行++运算符操作时(以++为例),deque会将迭代器中的cur和last相比较,不等就直接++,相等就进行判断,先让node指向下一块缓存区,然后cur就指向下一个缓存区的第一个元素。

deque的insert()
当deque插入元素时,先判断插入位置是否是deque的最前端或者最后端,如果是,直接用push_front()或者push_back()就可以;如果不是,先判断插入点离前端比较近还是后端比较近,然后再进行插入;下面是实现代码。


2.容器queue和satck

queue和stack都用deque或者list做底层,它们包含的元素就是deque或者list,然后使用它们的部分功能;它们都不支持遍历;
queue不可以用vector做底层支撑,stack可以;
stack和queue都不可以选择set或者map做底部支撑;


3.容器rb_tree

红黑树(Red Black Tree) 是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。红黑树和AVL树类似,都是在进行插入和删除操作时通过特定操作保持二叉查找树的平衡,从而获得较高的查找性能。它虽然是复杂的,但它的最坏情况运行时间也是非常良好的,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插入和删除,这里的n 是树中元素的数目。

rb_tree提供“遍历”操作以及iterator。
按照正常规则(++ite)遍历,就能获得排序状态;

我们不应该适用rb_tree的iterator改变元素值,因为元素有其严谨的排列规则,编程层面并未阻绝此事,因为红黑树即将为set和map服务;

如下图是用于rb_tree的设计。




4.容器set/multiset
它们以红黑树为底层结构,所以它们有元素自动排序的特性;
排序的依据是key,而set/multiset的元素的key和value合一;

set/multiset提供遍历操作及iterator。按照正常规则遍历,便能获得排序状态;

我们不能使用set/multiset的iterator改变容器中的值;

当set/multiset在使用iterator时,拿到的是rb_tree的iterator,而这iterator是const类型;

set的所有操作,都交给红黑树去做;

VC6不提供identify(),那么set和map如何使用rb_tree?实际上VC6的set和map的红黑树中也有类似于identify的操作;



5.容器map和multimap
它们以红黑树为底层结构,所以它们有元素自动排序的特性;
排序的依据是key,而map和multimap的元素有key和value;

set/multiset提供遍历操作及iterator。按照正常规则遍历,便能获得排序状态;

我们不能使用map和multimap的iterator改变容器中的key的值,但是可以改变data;
要做到这一点自动将user指定的key设为const,而data为non-const;

map独特的operator[]:
Allows for easy lookup with the subscipt operator([])
returns data associated with thw key specified in subscript.
If the key dose not exist,a pair with that the key is created
using default values,which is then returned.

翻译过来就是:如果找到就传回来key对应的那个iterator,没有找到就传回最适合安插
那个key的iterator。


6.容器hashtable

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。  (百度百科)

给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

(百度百科)


下图是哈希表的设计。其中HashFunc是为了帮我们计算出元素位于哈希表中的编号。在使用hashtable时,需要自己写一个hashfunc;
















  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值