STL
什么是STL:
STL(Standard Template Library)标准模板库,是“容器”的集合。
STL核心类库的基本概念:
1.容器(Containers):可容纳各种数据类型的数据结构(计算机存储,组织数据的方法)。
2.迭代器(Iterators):可依次存取容器中元素的东西。
3.算法(Algorithms):算法作用于容器。
STL所有的组件都由模板(template)构成,其元素可以是任意类型。
STL容器:
常用顺序容器:vector,deque,list。
常用关联容器:set,map。
容器适配器:stack,queue,priority_queue。
STL算法:搜寻,排序,拷贝等。
iterator-迭代器:
迭代器(iterator):用来指向,遍历,修改容器元素的变量,类似指针。
iterator基本功能:
1.可以遍历STL内全部或部分元素对象;
2.指出容器中的一个特定位置。
iterator基本操作:
1.*:返回当前位置上的元素的值,如果该元素有成员变量,可以通过迭代器operator->取用;
2.++:将迭代器前进至下一元素;
3.==和!=:判断两个迭代器是否指向同一位置;
4.=:为迭代器复制(※注意:将所指元素的位置复制过去)。
iterator常用函数:
1.begin():返回一个迭代器,指向第一个元素;
2.end():返回一个迭代器,指向最后一个元素之后。
iterator定义:
容器
vector-动态数组:
向量(vector):是一个顺序容器,他能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意元素类型的动态数组(元素个数可变)。
vector如何定义:
1.vector
2.vector
3.vector
4.vector
vector常用函数:
1.push_back(元素):增加一个元素到向量后面;
2.insert(位置,元素):插入元素到向量的指定位置;
3.insert(位置,个数n,元素):插入n个相同的元素到指定位置;
4.insert(位置,向量头指针first,尾指针end):将另一个向量从first开始到end结束(不包括end)之间的内容插入到该向量的指定位置;
5.erase(位置):删除指定位置的元素;
6.erase(开始位置,结束位置):删除向量中[first,last)中元素;
7.pop_back():弹出(删除)向量中最后一个元素;
8.clear():清空向量中所有元素,size()变为0;
9.运算符[i]:取向量下标为i的元素;
10.front():取向量第一个元素;
11.back():取向量最后一个元素;
12.begin():返回向量头指针(迭代器),指向第一个元素;
13.end():返回向量尾指针,指向最后一个元素的下一个位置;
14.rbigin():返回迭代器,指向最后一个元素;
15.rend():返回迭代器,指向第一个元素之前的位置;
16.size():返回向量中实际元素的个数;
17.resize(大小):重新定义向量的大小,也就是可以保存元素的个数;
18.max_size():得到vector最大可以是多少;
19.empty():判断向量是否为空,等价于size()为0;
20.swap(元素1,元素2):交换两个类型相同的元素。
21.sort(向量名.begin()+x,向量名.begin()+y,cmp):将向量中0+x到0+y的数据按升序排序(※注意:cmp可修改排序方法);
22.reverse(向量名.begin()+x,向量名.begin()+y,cmp):将向量中0+x到0+y的数据按降序排序(※注意:cmp可修改排序方法);
deque-双向队列:
deque也是顺序容器的一种,也是一个可变长数字,定义跟vector一样(vector全改写成deque),所有vector的成员函数它都能使用,它与vector的区别是在头尾删除元素比vector性能要好,随机存取元素在常数时间内完成(但慢于vector)。
deque的两个自己的成员函数:
1.push_front(x):将x插到数字头部;
2.pop_front():删除头部元素。
deque使用注意:
1.deque支持随机存取;
2.deque支持在头部和尾部存储数据;
3.deque不支持capacity和reserve。
list-链表:
list是一个线性双向链表结构,定义跟vector一样(vector全改写成list),它的数据由若干个结点组成,每一个结点都包含一个数据,一个前指针和后指针,他无需分配指定内存且大小可以任意伸缩,因为它存储在非连续内存空间里,并且由指针把前后元素连起来。(※注意:其他请看链表专门博客)
list的特点:
1.list检索性能非常不好,但它可以迅速的对任何结点进行插入和删除操作,因为list的每一个结点保存着它在链表中的位置,插入或删除一个元素仅最对对三个元素造成影响;
2.list支持双向迭代器,没有下标,必须使用迭代器遍历list。
list常用函数:
1.push_back(元素):往链表尾部加入元素;
2.push_front(元素):往链表头部加入元素;
3.pop_back(元素):链表尾部移除元素;
4.pop_front(元素):链表头部移除元素;
5.insert(位置,元素):插入元素到链表的指定位置;
6.insert(位置,个数n,元素):插入n个元素到链表的指定位置;
7.begin():获取链表起始地址;
8.end():获取链表结束地址;
9.size():返回链表元素个数;
10.erase(开始位置,结束位置):删除链表中开始位置到结束位置的元素;
11.remove(元素):删除和元素相同的元素;
12.sort(cmp):把链表升序排序(※注意:cmp可修改排序方法);
13.clear():清空链表元素;
14.empty():判断链表是否为空;
15.reverse(开始位置,结束位置):翻转开始位置到结束位置的元素;
16.swap(元素1,元素2):交换元素1和元素2的值;
set-集合:
set是关联容器的一种,定义跟vector一样(vector全改写成set),是排好序的集合(元素已经进行排序),set中不能有重复元素。
set注意:
1.不能直接修改set中元素的值,因为元素被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上面进行查找等操作会得到错误结果,因此。如果要修改set中某元素的值,正确做法是先删除这个元素,再插入新元素。
2.multiset容器就像set容器,但它可以保存重复元素。
3.set支持双向迭代器(不支持随机迭代器),再插入和删除时,要特别注意。
4.在STL使用结构体,需要对特定的运算符进行重载;STL默认使用小于号来排序,因此,默认重载小于号;(如果使用greater<>比较器就要重载大于号),且要注意让比较函数对相同元素返回false。
例子:(※注意:结构体重载运算符小于号)
set常用函数:
1.begin():获取set容器起始地址;
2.end():获取set容器结束地址;
3.insert(元素):插入元素到set容器中去(※注意:set是自动排好序);
4.erase(位置):删除指定位置的元素(※注意:不能用下标,要用迭代器);
5.erase(元素):删除指定元素;
6.find(元素):查找匹配的元素迭代器,若不存在,返回set.end();
7.clear():清空set;
8.size():返回set容器中实际元素个数;
9.empty():判断set是否为空。
map:
map也是关联容器的一种,map的每一个元素部分都分为关键字和值两部分,容器中的元素是按关键字排序的,并且不允许有多个元素的关键字相同。
map如何定义:
map<a,b> m:定义一个名字为m,关键字类型为a,值类型为b的map。
map的特点:
1.第一个可以称为关键字(key),每一个关键字只能在map中出现一次,第二个称为该关键字的值(value);(multimap允许存储相同关键字的元素)
例子:
(1).map<string,int> m:可以把字符串映射为整数;
(2).map<double,int> m:可以把双精度浮点数映射为整数;
2.map中的元素是一对数据:<关键字,数值>,这个概念在STL中有专门的数据结构叫pair,有一个相关函数make_map和两个成员变量:first和second;
3.pair是将两个数据组合为一组数据,当需要这样需求就可以使用pair,pair的实现是一个结构体,主要的两个成员变量是first和second;
4.不能直接修改map中的关键字,因为map中的元素是按关键字排序的。当关键字被修改后,容器并不会自动重新调整顺序,于是容器的有序性就会被破坏,再在其上面进行查找等操作会得到错误结果。
map的常用函数:
1.find(关键字):返回指定关键字元素的位置迭代器,如果不存在返回map.end();
2.count(关键字):统计指定关键字的出现次数;(由于map中每个关键字都最多出现一次,所以只能返回1或0)
3.insert(关键字,元素):插入关键字元素到map中,元素一般是make_pair(关键字,值);
4.erase(关键字):删除指定关键字的关键字元素;
5.erase(迭代器):删除指定位置的关键字元素(※注意:不能用下标,要用迭代器);
6.clear():清空map的元素;
7.运算符[]:取/赋值map的指定关键字的对应值,类似数组的下标计算;
8.begin():返回map中第一个关键字元素的地址;
9.end():返回map中最后一个关键字元素的地址;
10.size():返回map中实际元素的个数;
11.empty():判断map是否为空。
stack-栈:
stack是在顺序容器的基础上实现的,定义跟vector一样(vector全改写成stack),屏蔽了顺序容器的一部分功能。突出或增加另一些功能。
容器适配器的三个成员函数:(※注意:后面的queue和priority_queue都有)
1.push(元素):增加一个元素在头部(对于stack),增加一个元素在尾部(对于queue和priority_queue);
2.top():返回第一个元素;
3.pop():删除第一个元素。
stack常用函数:
1.size():返回栈中元素实际个数;
2.empty():判断栈是否为空。(※注意:栈:是一种后进先出(first in last out,简称FILO或者LIFO)的元素序列,访问和删除都只能对栈顶的元素(即最后一个被加入栈的元素)进行,并且元素只能被添加到栈顶)
queue-队列:
queue就是队列,定义跟vector一样(vector全改写成queue),队列是先进先出(first in first out),队列的访问和删除操作只能在队头进行,添加操作只能在队尾进行,不能访问中间元素。
queue的特点:
1.queue可以用list和deque实现,默认情况下使用deque实现;
2.先进先出(FIFO),队尾进,队头出。
queue常用函数:
1.front():返回队头元素;
2.back():返回队尾元素;
3.size():返回队列中元素实际个数;
4.empty():判断队列是否为空。
priority_queue-优先队列:
priority_queue是优先队列,它和queue的区别是优先队列队头元素永远是最大的。
priority_queue如何定义:
priority_queue<a,b,cmp> p:定义一个名字是p,数据类型为a,容器类型为b(※注意:只能是vector和deque,默认情况为vector),比较方式为cmp(※注意:只能是less和greater,默认情况为less)的priority_queue。
priority_queue的特点:
1.priority_queue可以用vector和deque实现,默认情况下使用vector实现;
2.priority_queue默认的元素比较器是less
3.定义priority_queue时,第三个参数可以用来指定排序规则;
4.priority_queue具有queue的所有特性,包括成员函数,只是在这基础上加了一个排序;
5.priority_queue内部并非有序。但队头一定是最大的元素。
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)
· spring官宣接入deepseek,真的太香了~