1.基本概念
1.STL全称是standard template library
2.STL主要有六个部件
- 容器:有泛化版本,其实是模板类
- 分配器:支持容器,为容器分配内存空间
- 算法:与容器是两个部门,它们之间由iterator迭代器联系
- 迭代器:泛化指针,有模板类型
- 适配器:转换(容器、仿函数、迭代器)之间相互转换
- 仿函数:作用像一个函数的类,重载()运算符
3. 每个容器都有默认分配空间的分配器类,一般是allocator类,但是也可以自己扩展,但是需要添加自己的头文件
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();