C++ STL 体系结构与内核分析第一次笔记

1.基本概念

1.STL全称是standard template library

2.STL主要有六个部件

  • 容器:有泛化版本,其实是模板类
  • 分配器:支持容器,为容器分配内存空间
  • 算法:与容器是两个部门,它们之间由iterator迭代器联系
  • 迭代器:泛化指针,有模板类型
  • 适配器:转换(容器、仿函数、迭代器)之间相互转换
  • 仿函数:作用像一个函数的类,重载()运算符

3. 每个容器都有默认分配空间的分配器类,一般是allocator类,但是也可以自己扩展,但是需要添加自己的头文件

Alt

4.

vector<int>vec;
for(auto elem:vec)
elem+=3;

上述程序中的elem并不会变,因为auto只判断元素类型,而不管是不是引用和常量,所以需要自己在auto后面添加&或者const表示链接到一个引用或者是个常量。

5.Array

必须先说定占用内存的大小,且容器的元素数据连续,所以push_back()和push_front()是不支持的

6.vector

内存的起点不会变,所以不能使用push_front(),但是可以使用push_back()

7.deque

是双端队列,前后都可以填充

8.list

其实是环状循环链表,添加数据很快,但是查找很慢

9.forward-list

单向链表

10.哈希表

根据一些计算来分配数据所在的内存空间,称之为bucket桶

11.qsort快排

用法之一:

qsort(c.data(),Asize,sizeof(Cclass),comparec)
//c.data()返回起始地址,Asize多少元素,sizeof(Cclass)每个元素多大,comparec排序准则

12.c.data():返回一个容器中包含的数据类型的指针,这个指针指向起点的地址

注意和begin()的区别,begin()传回的是一个迭代器(泛型指针),迭代器不是可输出输入类型,它并没有重载>><<运算符

在这里插入图片描述

2.vector

1.snprintf(args)在cstdio头文件中,cstdio表示STL标准输入输出库

其中的count形参表示存储最大数量

2.vector增长是两倍增长,可以向后扩展,不能向前

3.srink_to_fit()

可以归还内存,所以vector内存可以增加也可以减小

4.size()

返回真正的数据个数,capacity()是能包含的容量大小

5.字符串常量的大小是strlen(s)+1字节,但是string类对象的大小是28,这个和string类中包含的非静态成员、虚表有关(如果有的话)

6.find(arg)也是一个模板函数,返回一个迭代器

3.list双向链表

1.max_size()

表示链表能存放的最大元素个数(注意存放的类型不同,个数不同,比如stirng和int就不一样)

2.标准库有一个sort算法(在algorithm库,std命名空间中),某些容器自己内部也有sort()函数

list不支持库中通用的sort()函数,是因为list的迭代器指向的数据不是连续的,并且通用sort来重排链表效率非常低,所以前辈们开发了一个list专用的排序算法

4.forward_list单向(前向)链表

没有push_back(),这事因为旧元素结构指向新元素结构的,另外也没有size()和back(),这是因为无法遍历整个数据结构。

5.deque队列(双端)

可以在两端扩充,其实是分段连续,但是从宏观来看,看起来就像整个是连续的,deque分成n个buffer,每个buffer内部就像vector一样是连续的数据结构,但是beuffer之间是通过指针来链接的,因此deque可以看做是vector+list的一种复杂数据类型,基本上容器能使用的算法和操作,它都支持。

6.stack栈

先进后出push() pop(),list的adaptor适配器

7.queue单向队列

先进先出,deque的adaptor适配器
stack和queue本身不实现数据结构,只是在它们依托的容器类型上进行改变,它们不提供iterator迭代器操作,这是因为会破坏其特有的性质

8.关联容器

关联容器使用树(红黑树)这种数据结构来实现的

9.multiset

插入元素用insert(),没有push_back()和push_front(),自己有find()函数,可以包含重复value

10.bucket_count()

桶的个数,如果元素个数大于等于桶的个数,桶的个数就要扩充两倍(大约两倍)

11.load_factor负载因子

负载因子表示已用的通个数/桶的总个数

vector<int>vi;
	cout << vi.max_size() << endl;;
	vector<string>vs;
	cout<<vs.max_size();

Alt

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值