C++ STL总结

本文介绍了C++中的STL(标准模板库),包括它的六大组件:容器、算法、迭代器、关联式容器、仿函数和适配器。详细讨论了序列式容器如vector、list、deque以及string的特点和操作,同时也提到了关联式容器如set和map。此外,还阐述了迭代器的重要性和失效情况,以及仿函数的作用和适配器如stack、queue和priority_queue的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是STL?

STL是标准模板库。STL是对常见数据结构的封装,以及通用的算法。算法可以操作任意类型的数据并且可以处理任意数据结构。

STL六大组件

在这里插入图片描述

容器:组织数据,对常见数据结构的封装。
序列式容器: 对线性数据结构的封装----顺序表&链表
序列式容器的接口分类:
构造与销毁
迭代器操作
容量操作
元素访问操作
修改操作
特殊操作

string类容器:管理字符串。
1.浅拷贝问题的解决办法。

vector类容器:动态类型的顺序表。
1.迭代器失效。

array类容器:静态类型的顺序表(C++11)(不常用)
list类容器:带头结点的双向循环链表
1.对原生态指针的封装
2.迭代器失效

forward_list:带头结点循环单链表(C++11)(不常用)
deque:双端队列,其底层类似于动态的二维数组
1.迭代器

关联式容器:

算法: STL常用算法—通用的算法(与数据类型无关,与数据结构无关)
1.find
2.swap
3.reverse
4.sort
5…

迭代器: 每个容器必须自己负责提供迭代器
迭代器的分类:
1.原生态的指针
2.对原生态指针的封装(例:list)
如何给一个类增加迭代器:
1.根据容器底层数据结构封装一个迭代器(实际是对指针的封装)
(1)如果容器中的迭代器是原生态指针,则不需要对指针进行重新封装(例如:vector,string)
(2)如果迭代器不是原生态指针,则需要对原生态指针进行适合类类型的封装。
封装步骤:
构造函数
迭代器的类对象要能够按照指针方式使用:* -> 前置++/-- 后置++/–
迭代器的类对象之间能够进行比较:= !=

2.在容器类中给迭代器类型取别名:typedef 迭代器类型 iterator
目的:为了方便统一。

3.给出begin()和end(),此处begin()和end()是左闭右开的区间

**迭代器失效:**指针指向的内容不存在,成为野指针。

仿函数: 可以将一个类的对象按照函数的方式进行使用。

//模板
class N
{
public:
	...operator()(...)
	{}
};

//例子:
class Is_odd
{
public:
		bool operator()(const int& a)
		{
			return (a%2)!=0;
		}
};

作用: 让一个算法更加的灵活

适配器:
stack:底层是对deque的再次封装。

queue:底层是对deque的再次封装。

priority_queue:是堆,底层用是对vector的再次封装。
优先级队列,默认为大堆---->less,如果要其为小堆---->将less改为greater(注意:用less或greater时应有头文件 < functional>
优先级队列中存储元素的类型:
1.内置类型,可以直接通过less和greater来形成大堆或者小堆。
2.自定义类型,可能需要重载(less)<或者(greater)>(例:存放的是Date类型的对象)
3.有些情况下需要通过仿函数进行定制(例子:存放的是Date*)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值