C++标准库(STL)与泛型编程

六大部件

在这里插入图片描述

  • 分配器:支持容器
  • 容器:解决内存的存放与取的操作,是一个模板类
  • 算法:模板算法
    数据在容器里面,操作这些数据的算法是在另外的一组,不在容器的class里,这就不是面向对象编程,而是泛型编程
  • 迭代器:作为容器和算法之间的桥梁,是一种泛化的指针,
  • 仿函数:作用像是一个函数,是一种抽象的函数,比如两个类之间的相加
  • 适配器:可以做转换,比如用来绑定在某个算法中 。

复杂度

根据使用条件,选择适配容器。

前闭后开区间

begin指向第一个元素,end指向最后一个元素的下一个元素

Container<T>::iterator iter = c.begin();
for (;, iter != c.end(); ++iter)

注意以下两种用法

for (auto elem: vec)
{
	cout << elem;
}

for (auto & elem: vec)
{
	elem *= 3;
	cout << elem;
}

前者将创建范围内每个元素的副本,其修改不会影响vec中的相应元素,由于每个循环都会创建一个副本,因此会带来系统开销。
后者增加了引用,也就是对于元素的操作,可以回返给elem元素本身,即改变内存中的值。
如果要确保未修改a中的数据并且要提高效率,可以使用const auto & elem : vec格式。

容器分类

  1. 顺序式容器
  2. 关联式容器(key-value):用于查找。实现方式为红黑树。
  3. 不定序容器(Unordered Container)其实本质上属于关联式容器的一种。实现方式为hashtable(Separate Chaining散列表)

在这里插入图片描述

vector

三个迭代器:start、finish、end_of_storage

list

环形双向链表

array

array必须指定大小,如:array<int, 10> myArray。没有构造函数和析构函数。其迭代器是指针。

deque

双向扩充
在这里插入图片描述
往前扩充:开辟缓冲区,然后用一个vector类型的map,其头元素进行指向新空间
往后扩充:同理,后元素

queue
stack

是container adapter

RB-tree

set multiset是container adapter

1、概念:

1)Vector

连续存储的容器,动态数组,在堆上分配空间

底层实现:数组

两倍容量增长:

vector 增加(插入)新元素时,如果未超过当时的容量,则还有剩余空间,那么直接添加到最后(插入指定位置),然后调整迭代器。

如果没有剩余空间了,则会重新配置原有元素个数的两倍空间,然后将原空间元素通过复制的方式初始化新空间,再向新空间增加元素,最后析构并释放原空间,之前的迭代器会失效。

性能:

访问:O(1)

插入:在最后插入(空间够):很快

在最后插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。

在中间插入(空间够):内存拷贝

在中间插入(空间不够):需要内存申请和释放,以及对之前数据进行拷贝。

删除:在最后删除:很快

在中间删除:内存拷贝

适用场景:经常随机访问,且不经常对非尾节点进行插入删除。

  1. List

动态链表,在堆上分配空间,每插入一个元数都会分配空间,每删除一个元素都会释放空间。

底层:双向链表

性能:

访问:随机访问性能很差,只能快速访问头尾节点。

插入:很快,一般是常数开销

删除:很快,一般是常数开销

适用场景:经常插入删除大量数据

2、区别:

1)vector底层实现是数组;list是双向 链表。

2)vector支持随机访问,list不支持。

3)vector是顺序内存,list不是。

4)vector在中间节点进行插入删除会导致内存拷贝,list不会。

5)vector一次性分配好内存,不够时才进行2倍扩容;list每次插入新节点都会进行内存申请。

6)vector随机访问性能好,插入删除性能差;list随机访问性能差,插入删除性能好。

3、应用

vector拥有一段连续的内存空间,因此支持随机访问,如果需要高效的随即访问,而不在乎插入和删除的效率,使用vector。

list拥有一段不连续的内存空间,如果需要高效的插入和删除,而不关心随机访问,则应使用list。

使用分配器allocator

迭代器的设计原则和iterator Traits(特征)

自定义的类,例如list、map等(自己往里面填充各种类型的数据),在类定义里就有iterator,那么调用的时候直接类名::iterator就可以调用了,但如果是内置类型,比如int、float没有iterator。具体实现机制有一个萃取机Iterator Traits。
Iterator Traits用以分离class iterators和non-class iterators。
根据使用条件的不同,来选择不同的结构体实现,模板在萃取机制中的应用。模板让编译器能够根据具体的类型编译出具体的函数,从而确定到底是用指针类型还是迭代器的类型,进而适配成统一的接口,有点类似多态的概念。

在这里插入图片描述

STL周边技术

一个万用的Hash Function

  • 14
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 16
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值