STL常用容器
常用STL
一. stack
1.简介: 是最常用的STL容器,需要加 <stack> 头文件
2.定义: stack <type> name;
3.可用函数:
- size:大小
- empty:是否为空
- push:栈顶插入
- pop:栈顶取出
- top:栈顶元素
二. queue
1.简介: 是最常用的STL容器,需要加 <queue> 头文件
2.定义: queue <type> name;
3.可用函数:
- size:大小
- empty:是否为空
- push:队尾插入
- pop:队首取出
- front:队头元素
- back:队尾元素
均可通过 " . + 函数名" 调用。
三. priority_queue
1.简介: 一个大/小根堆(默认大根堆), 需加 <queue> 头文件
2.定义: proirity_queue <Type,Container,Functional> name;
3.可用函数:
- size:大小
- empty:是否为空
- push:堆插入
- pop:堆顶取出
- top:堆顶元素
4.关于priority_queue中元素的比较:
模板申明带3个参数:Type, Container, Functional,其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。
Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector。
如果缺省后两个参数, 则默认大根堆。
5.将大根堆转化为小根堆
① 将三个参数全部填上, STL里面定义了一个仿函数greater<>,基本类型可以用这个仿函数声明小顶堆。
priority_queue<int, vector<int>, greater<int> > q; //一个小根堆
② 使用 pair 类型, pair 中first存所需比较元素的相反数,second中存放需要元素。
priority_queue < pair<int, int> > q;
③ 使用结构体重载小于号转化,此方法可以存较多元素, 实现较复杂的操作。
struct node { int x; bool operator < (const node & b) const { return x > b.x; //将小于号重载为大于号即可 } }; priority_queue <node> q;
另:后两者常用于Dijstra求最短路。
四. deque
1.简介: 一个双端队列, 需加 <deque> 头文件
2.定义: deque <type> name;
3.可用函数:
- []:随机访问
- begin/end:头/尾 迭代器
- front/back:头/尾 元素
- push_back:从队尾插入
- push_front:从队头插入
- pop_back:从队尾出队
- pop_front:从队头出队
- clear:将队列清空
注:deque支持随机访问,时间复杂度
五. vector
1.简介: 一个长度可变的数组, 需加 <vector> 头文件
2.定义: vector <type> name;
3.可用函数:
- [ ]:随机访问
- size:大小
- empty:是否为空
- clear:将vector清空
- begin/end:头/尾 迭代器
- front/back:头/尾 元素
- push_back/pop_back:从尾插入/删除
- resize:s.resize(siz),将名为s的vector的size定义为siz
- at: 功能类似于map和set的find函数,越界时会抛出错误,可以当[]使用,但会更慢。
4.对vector中元素进行逐个访问:
使用iterator、auto 或 下标
vector <int> vec; for (vector <int> ::iterator it = vec.begin(); it != vec.end(); ++ it) { cout << *it << endl; } for (auto a : vec) { cout << a << endl; } for (int i = 0; i < vec.size(); ++ i) { cout << vec[i] << endl; }
六. set(multiset)
1.简介: 一个集合(封装好的平衡树(红黑树))。
set , multiset 需加 <set> 头文件
set默认升序,如需降序这么写:
set <int, greater<int>> st
;
副: set 为有序集合, multiset 为有序多重集合, unordered_set(基于Hash表) 很少用,故不多赘述。
2.定义: set <type> name;
3.可用函数:
-
size:大小
-
empty:是否为空
-
clear:将集合清空
-
begin/end:头/尾 迭代器
-
front/back:头/尾 元素
-
insert:向集合中插入元素,时间复杂度 (副: multiset 可以重复插入元素)
-
find:s.find(x)会于集合中查找等于x的元素,并返回指向该元素的 迭代器 , 若不存在,则返回 s.end(), 时间复杂度
-
lower_bound/upper_bound:用法与find类似。
①s.lower_bound(x) 查找 的元素中最小的, 并返回指向该元素的迭代器
②s.upper_bound(x) 查找 的元素中最小的, 并返回指向该元素的迭代器
-
erase: 删除
设it为一个迭代器, s.erase(it) 从s中删除迭代器it指向的元素, 时间复杂度
设x为一个元素, s.erase(x) 从s中删除所有等于x的元素, 时间复杂度 (k 为被删除的元素个数)
如果想从multiset中删除掉至多1个等于x的元素,可以执行if((it = s.find(x)) != s.end()) s.erase(it); -
count: s.count(x) 返回集合s中等于x的元素个数, 时间复杂度 (k 为元素x的个数)
4.对集合中元素的遍历:
①建立迭代器
for(set <int> ::iterator it = s.begin(); it != s.end(); ++it) { cout << *it << endl; }
②使用auto
for (auto x : s) { cout << x << endl; }
七. map(unordered_map)
1.简介: 一个键值对kay-value的映射(实现为一棵以key为关键码的红黑树)。map的key和value可以是任何类型, 其中k必须定义“”运算符。
map 需加 <map> 头文件, unordered_map 加 <unordered_map> 头文件。
2.定义: map <key_type,value_type> name;
副: multimap 与 map 的区别类似与 multiset 和 set, 只是在能否重复上不同,故不多赘述。
3.可用函数:
- size:大小
- empty:是否为空
- clear:将集合清空
- begin/end:头/尾 迭代器
- insert/erase:插入/删除 与set类似, insert的参数为 pair <key_type,value_type>, erase的参数可以为pair或迭代器
- find:h.find(x) 在名为h的map中查找key为x的二元组, 并返回指向该二元组的迭代器。 若不存在,则返回 h.end()。时间复杂度
- []操作符:h[key]返回key映射到的value的引用, 时间复杂度
八. bitset
1.简介: 可看作一个多位二进制数,每八位占用1个字节,相当于采用了状态压缩的二进制数组,并支持基本的位运算操作(~, &, |, ^, >>, <<, ==, !=)。
2.定义: bitset <length> name;
3.可用函数:
-
[]:随机访问
-
count:s.count() 返回有多少位为1, 时间复杂度
-
any/none:
①若s所有位都为0, s.any()返回false, s.none()返回true。
②若s所有位都为0, s.any()返回false, s.none()返回true。
-
set:s.set()将所有位变为1,s.set(k, v)将s的第k位改为v。
-
reset:s.reset()将所有位变为0,s.reset(k)将第k位改为0。
-
flip:s.flitp()将s的所有位取反,s.flitp(k)将s的第k位取反。
另副一些方便的STL函数
-
emplace()
在对STL中vector, set, queue进行插入时(如:insert(), push_back())会先对对象进行初始化构造, 后插入时再进行一次拷贝操作,时间复杂度较高。而emplace可以直接插入,常数较小。
注意:只有把emplace当做一个构造函数时才有优势,将构造好的元素插入时两者无差别。
副:
insert()/push() -> emplace() push_back() -> emplace_back()
-
distance()
是一个常用的迭代器操作函数,用来计算两个迭代器之间的距离,它可以接受任何类型的迭代器
Updata on 11.14: stl容器是可以直接修改其中内容的,但不会修改原变量的值。我之前一直以为放到栈和队列里的数据不能直接改
我是SB bs。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律