STL

P2:STL体系结构介绍

(1)STL六大部件:容器,分配器,算法,迭代器,适配器,仿函数。
(2)前闭后开区间 [ ),例如 对象都有c.begin() 和 c.end()两个个函数。c.begin() 指向第一个元素地址,c.end()指向最后一个元素地址的下一个地址。
在这里插入图片描述

P3:Array(数组)

(1)大小固定。

P4:vector(向量)

(1)分配器会扩充, vector只能向后扩展,扩展的方式是两倍扩展。

P5P6:一些容器

(1)list 双向链表。
(2)forward_list 单向列表,只能头插,头插快。
(3)deque 双向队列。每次扩展一个buffer。
(4)stack栈,先进后出。
(5)queue队列,先进先出。

P9: OOP vs. GP

(1)OOP(object-oriented programming):面向对象编程。data和method放在一起。、
(2)GP(generic programming):泛型编程。将data和methods分开。好处:容器和算法可以各自设计,以迭代器联通。算法通过迭代器确定操作范围,并通过迭代器取用容器的元素。
STL是GP。

P13: List

双向链表。每个元素都有一个指针指向前一个元素,一个指针指向后一个元素。

P15:萃取机 Iterator traits

在算法中运用迭代器时,会用到容器相应的类型。萃取机就是用来提取相应的类型。如果迭代器(指针也可以称为迭代器)不是一个class type(而是指针、引用),就无法进行正确的参数推导,所以要引入萃取机。
萃取机可以分辨它获得的iterator是(1)class iterator T 或者(2)普通指针,然后获得对应的类别。 用模板偏特化来实现。对传入的型别为pointer和pointer-to-const设计偏特化版本。
五个类别:
value_type:迭代器所指对象的类型。
difference_type:两个迭代器之间的距离。
reference:容器内元素的引用。
pointer:容器内元素的指针。
iterator_category:表示迭代器类型,根据迭代器类型激活重载函数。

P16: Vector

动态增长的数组。二倍成长。成长另外开辟一块空间,把原来的都拷贝过去,这会导致很多的拷贝构造,以及要把原来的一个一个析构,成本大。
成员有三个指针,一个start,一个finish,一个end_of_storage。 第一个元素、最后一个元素、容器最后。容器是“前闭后开”, 后面两个指针指向的是最后一个的下一个。

P17:array

数组,只有它定义的时候要指定大小。

P18:deque

双向队列,双向开口的连续线性空间。有一个vector和一系列缓冲区。vector中的元素指向缓冲区。底层存储是不连续的,但是可以通过迭代器,让他看起来是连续的。
插入元素的时候会判断离头近还是离尾近,选择近的地方插入。插入需要把前面/后面的元素全部推动。调用许多构造和析构,所以找近的方向。

stack栈和queue队列是建立在deque上的适配器。stack和queue不允许遍历,也不提供 iterator,可以选择以list或deque作为底部结构。queue不可选择vector做底层结构,stack可以选择vector。都不可选择set或者map做底部结构。
栈先进后出,队列先进先出。

P20: 红黑树

set、multiset、map、multimap背后都是一颗红黑树。
红黑树的根节点上面有一个头结点,三个指针指向根节点、begin(最小的值),end(最大的值)。
红黑树的遍历操作,能获得排序状态。
在红黑树的内部,迭代器是可以改变节点的值,这样的设计是因为map只要不改变key,是可以改变data的。但是要改变key的值,程序上是可以变的,但是我们不可以去改变,因为会破坏红黑树。

P21:set、multiset(associative containers 关联容器)

定义set,内部定义为红黑树。对于set而言,key就是value。
set不可以通过迭代器改变节点的值(程序上就不可以,二红黑树在程序上是可以的)。如何做到:获得的迭代器是一个const迭代器,不可改变。
set自己不做事情,它的实现都直接通过红黑树实现。
multiset的元素可以重复。两者的实现区别在于insert函数。一个允许key重复,一个不允许。

P22: map、multimap(associative containers 关联容器)

与set的区别:set的data就是key,而map的key和data不是同一个。无法使用迭代器改变元素的key,但可以改变元素的data。因此map的内部自动将user指定的keytype设为const,如此便能禁止对元素的key赋值。
在定义map的时候要确定 key和data的类型。在map中会将key和data包成一个pair,放入红黑树。
map可以用[ ]插入元素。对[]进行了重载,如果找到key就传回来(如果重复,返回的是第一个元素,map和multimap都可以用[],但是multimap不可以用[]插入),如果没有找到就插进去。 eg. map[i] = data; 给map的key[i]插入data,

P23:hashtable

如果separate chaining 太长,就像链表,那就是list的线性时间,这就失去了哈希表的意义。当元素个数比bucket(用vector实现)多时,要进行rehashing。 rehashing就是将篮子翻倍(也不一定完全翻倍,是翻倍附近的素数,篮子数量是素数),再将元素重新排列。
每一个元素都有一个编号,object用一个hash function来得到编号即hashcode(前面就是用hashcode来计算与篮子数量的余数来确定放在哪里)。

P26 (associative containers 无序容器)

unordered_set unordered_multiset
unordered_map unordered_multimap

associative containers VS associative containers

  • 关联容器基于红黑树,是近似于平很的二叉查找树,数据是有序的。 查找、插入、删除的时间复杂度O(logN);无序容器基于哈希表,查找、插入、删除时间复杂度是O(1),但是空间复杂度要高出许多
  • 如果需要高效率查询,使用无序容器,但是对于迭代器的遍历效率不高;对内存大小敏感或者数据存储要求有序,选择关联容器。

P28:迭代器分类

random_access_iteration: 随机访问迭代器 Array, Vector, Deque
bidirectional_iteration: 双向迭代器 List, 基于红黑树的容器,
farwsrd_iteration: 单项迭代器 Forward-List ,
基于哈希表的容器,要看他桶子下面的链表是单项还是双向的来判断迭代器类型。

P31:仿函数function

是一个类,其中重载 ()。一般都是很简单的操作,作用是因为要把操作传入算法中去。

//一个比大小的仿函数。
template<class T> struct greater: public binary_function<T,T,bool>{
	bool operator() (const T&x, const T&y) const { return x>y;}
};

//在算法中使用仿函数
sort(xx.begin(). xx.end(), greater<int>());

适配器

作简单地改变,比如改变接口数量、改变里面函数名称,桥梁的作用。使因为接口不兼容而不能合作的可以一起运作。
function adapter:仿函数适配器,改变仿函数接口者
container adapter: 容器适配器,stl提供queue和stack,修饰deque的接口。
iterator adapter:迭代器适配器

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值