C++ STL记录

STL六大部件:
1、容器,2、分配器,3、算法,4、迭代器,5、适配器,6、仿函数。

1、容器
顺序式容器:array,vector,list,forward_list,deque
关联式容器:set,multiset,map,multimap,unordered_set,unordered_map

array:
使用 array 容器类型时,需要在源文件中包含头文件 array。array相当于我们常用的数组,声明时要规定使用的类型和大小,规定大小为0时,系统默认大小为1,array不需要构造函数,在使用时大小不可修改。array在内存上连续存储,各元素在地址上连续。声明时数据可以不给初值,默认为0。可调用其成员函数 fill(a),将所有元素设成给定值a。

vector:
使用vector时,要包含头文件vector。vector就是我们常说的可变数组,动态数组,声明时可以不规定其容量,在后续添加元素时,如果当前容量不够,会执行扩容,这样就形成了可变数组,不同的源代码中给定的扩容机制不同,有两倍扩容也有一点五倍扩容,这个扩容相对来说是比较麻烦的,首先需要在内存中寻找一块可以满足当前内存需求的内存空间,然后把旧内存空间中的所有元素都拷贝进新内存空间中去,之后再在新内存空间中的原数据的后面继续进行插入新元素,并且同时释放旧内存空间。
常用成员函数:push_back,pop_back,insert,erase,size,capacity,resize,reserve,swap,emplace,emplace_back,operator[]…

list:
list是链表,使用要包含头文件list。在stl中实现为双向环状链表,每个节点有两个指针域,分别指向前一个和后一个节点,数据域存放data。list内存上不连续,通过迭代器操作,插入和删除比较方便,无法通过下标进行访问。

foward_list:
单向链表,类似于list,但是每个节点只有一个指针域,指向其下一个节点。在空间上占用内存更小,但是只能够进行单向遍历。

deque:
双端队列,在头部和尾部都可以进行插入和取出操作,deque在存储上是一种假连续,也称分段连续。它使用一个数组来存放buffer的指针,每个buffer用来存储数据,这些buffer每个在内存上不一定是连续的,通过数组存放的指针将他们的空间链接到了一起。

2、分配器 allocator
分配器负责分配和管理内存空间,STL默认的allocator是一个由两级分配器构成的内存管理器,当申请的内存大小大于128byte时,就启动第一级分配器通过malloc直接向系统的堆空间分配,如果申请的内存大小小于128byte时,就启动第二级分配器,从一个预先分配好的内存池中取一块内存交付给用户,这个内存池由16个不同大小(8的倍数,8~128byte)的空闲列表组成,allocator会根据申请内存的大小(将这个大小round up成8的倍数)从对应的空闲块列表取表头块给用户。这种内存分配器局限于STL容器中使用,并不适合一个通用的内存分配。因为它要求在释放一个内存块时,必须提供这个内存块的大小,以便确定回收到哪个free list中,而STL容器是知道它所需分配的对象大小的。

3、算法
算法就是我们常用的一些函数来方便我们对容器的操作,STL算法部分主要由头文件algorithm,numeric,functional组成。要使用 STL中的算法函数必须包含头文件algorithm,对于数值算法须包含numeric,functional中则定义了一些模板类,用来声明函数对象。 STL中算法大致分为四类:
非可变序列算法:指不直接修改其所操作的容器内容的算法。可变序列算法:指可以修改它们所操作的容器内容的算法。
排序算法:包括对序列进行排序和合并的算法、搜索算法以及有序序列上的集合操作。
数值算法:对容器内容进行数值计算。

4、迭代器(iterator)
之前写过了一个文章,记录了iterator的使用和一些注意事项。
https://blog.csdn.net/weixin_44468582/article/details/105272507

5、适配器
适配器就是为了完成某种功能在原来的基础上进行了改装,使其能够满足新的需求。
STL中有容器适配器,迭代器适配器和函数适配器。其中容器适配器有stack,queue和priority_queue。迭代器适配器有插入迭代器、反向迭代器和IO迭代器。函数适配器通过不同函数的绑定,组合和修饰能力,可以实现强大的功能,配合STL泛型算法完成复杂功能。

6、仿函数
仿函数(functors)就是函数对象(function objects)。仿函数主要用于STL中的算法中,函数指针虽然也可以作为算法的参数,但是函数指针不能满足STL对抽象性的要求。仿函数本质就是一个类中重载了一个operator(),创建一个行为类似函数的对象。我们可以通过公有继承unary_function或binary_function使其融入STL体系中,其中unary_function具有一个参数,binary_function具有两个参数,继承后的仿函数就具有了自己traits,一些类型的typedef,使其能够完成告知适配器自己的参数类型argument_type和result_type。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值