【pat】C++之刷题常用STL容器整理
1.vector
动态数组,方便的动态扩容,方便的变量初始化(int类型默认初始化为0,bool默认初始化为false),可以用来实现邻接表(结点数太多的图)。
头文件
#include<vector>
using namespace std;
定义
//typename 可以是基本数据类型,可以是其它标准stl容器,可以是自定义结构体
vector<typename> name;
vector<int> v1;
vector<vector<int> > v2; //两个维度都是动态的
vector<student> v3(10);//一维固定为10,二维动态
元素访问
//1.下标访问
v[i]
//2.迭代器访问
vector<typename>::iterator it;
auto it;//另一种迭代器简易定义方法
for(auto it = v.begin();it!=v.end();it++)
cout<<*it;
//迭代器it可以进行算术运算
常用函数
函数 | 说明 |
---|---|
push_back(x); | 将元素x添加到容器末尾 |
pop_back(); | 删除容器末尾元素 |
size(); | 获取容器大小 |
clear(); | 清空元素 |
insert(it,x); | 在it处插入一个元素x |
erase(it); | 删除it处的元素 |
erase(first,last); | 删除[first,last)区间内的元素 |
使用场景
- 元素个数不确定
- 用于实现邻接表存储图
2.set
内部自动有序且不含重复元素的集合。
头文件
#include<set>
using namespace std;
定义
set<typename> name;
元素访问
for(auto it = v.begin();it!=v.end();it++)
cout<<*it;
常用函数
函数 | 说明 |
---|---|
insert(x); | 将元素x插入set容器中,并自动递增排序和去重 |
find(value); | 查找值为value的元素,返回对应迭代器 |
erase(it); | 删除it处的元素,通常结合find函数使用 |
erase(value); | 删除值为value的元素 |
erase(first,last); | 删除[first,last)区间内的元素 |
size(); | 返回容器大小 |
clear(); | 清空容器 |
使用场景:
- 自动去重并按升序排序
扩展:
需要元素不唯一,使用multiset
需要元素不排序,unordered_set(內部以散列代替了set内部的红黑树),速度比set快得多
3.string
字符串,可以替换为C语言版的字符数组(str.c_str();)。
头文件
#include<string>
using namespace std;
定义
string str;
内容访问
//1.下标访问
str[i]
//2.输入输出只能用cin和cout,除非转化为字符数组
//3.迭代器访问
常用函数
函数 | 说明 |
---|---|
operator+= | 字符串拼接 |
compare operator | 按照字典序比较大小 |
length()/size() | 获取字符串大小 |
insert(pos,str); | pos是int类型,表示在指定位置插入str |
insert(it,first,last); | 在it处插入[first,last)范围内的字符串 |
erase(it); | 删除it处的元素 |
erase(first,last); | 删除[first,last)范围内的元素 |
erase(pos,length); | 删除pos位置开始的length个字符 |
clear(); | 清空字符串 |
substr(pos,len); | 返回从pos位置开始len长度的字符串 |
string::npos | 作为find函数未找到的判断依据 |
find(str); | 返回str第一次出现的位置 |
replace(pos,len,str2); | 从pos位置开始,长度为len的子串替换为str2 |
4.map
将任何基本类型映射到任何基本类型(包括STL容器)。
可以用于hash散列(当元素个数比较多时,不适合用数组散列,就用map)
头文件及定义
#include<map>
using namespace std;
map<typename1,typename2> mp;
元素访问
//1.下标
mp['c']
mp[0]
mp["key"]
//2.迭代器
for(auto it = mp.begin(); it != mp.end(); it++){
cout<< it->first<<" "<<it->second;
}
常用函数
函数 | 说明 |
---|---|
find(key); | 返回键为key的映射的迭代器 |
erase(it); | 删除it处的元素 |
erase(key); | 删除key |
erase(first,last); | 删除[first,last)区间内的元素 |
size(); | 返回容器大小 |
clear(); | 清空容器 |
使用场景:
- 散列表
- 其他映射
扩展:
- 多映射,即一个key对应多个value,使用multimap
- unordered_map可以替代map,内部实现使用散列代替了map内部的红黑树实现,用于处理只映射而不需要按key来排序的需求,速度快
5.queue
队列,先进先出的容器,常用于广度优先搜索
头文件及定义
#include<queue>
using namespace std;
queue<typename> name;
常用函数
函数 | 说明 |
---|---|
push(x); | 元素x入队列 |
front(); | 访问队列的首元素 |
back(); | 访问队列的尾元素 |
pop(); | 队首元素出队 |
empty(); | 检测是否为空队列 |
size(); | 队列大小 |
使用场景
- 广度优先搜索
另外,需要注意使用front(),back(), pop()函数前,必须判断是否为空队列(使用empty函数)
扩展
- deque(double end queue,双端队列)首位皆可插入和删除
- priority_queue,使用堆实现的默认将当前队列最大元素置于队首的容器
6.priority_queue
优先队列,默认情况下是将队列中最大元素置于队首,优先级可以自定义。每次进行push(),pop()操作,底层的数据结构堆(heap)都会随时调整结构,使优先级最高的元素永远都在队首。
头文件及定义
#include<queue>
using namespace std;
priority_queue<typename> name;
常用函数
函数 | 说明 |
---|---|
push(x); | 将元素x入队 |
top(); | 访问队首元素 |
pop(); | 将队首元素出队 |
empty(); | 检测是否为空队列 |
size(); | 返回队列大小 |
优先级设定
基本数据类型(int,double,char)默认数字大或者字典序大的优先级高。
priority_queue<int,vector<int>,greater<int>> q;
- greater表示这个数字越小,优先级越高
- less表示数字越大,优先级越高(默认情况)
vector表示底层数据结构堆(heap)的容器
结构体优先级设置
#include<iostream>
#include<string>
#include<queue>
using namespace std;
struct fruit{
string name;
int price;
friend bool operator < (fruit f1,fruit f2){
return f1.price > f2.price;
}
}f1,f2,f3;
int main(){
priority_queue<fruit> q;
f1.name = "桃子";
f1.price = 3;
f2.name = "梨子";
f2.price = 4;
f3.name = "苹果";
f3.price = 1;
q.push(f1);
q.push(f2);
q.push(f3);
cout<< q.top().name<<" "<<q.top().price <<endl;
return 0;
}
output:
苹果 1
使用场景
可以用于dijkstra算法的顶点选择中
注意使用top()函数之前判断队列是否为空(使用empty()函数)
7.stack
栈,先进后出
头文件及定义
#include<stack>
using namespace std;
stack<typename> name;
常用函数
函数 | 说明 |
---|---|
push(x); | 元素x入栈 |
top(); | 获取栈顶元素 |
pop(); | 栈顶元素出栈 |
empty(); | 检测stack是否为空 |
size(); | 获取栈的大小 |
使用场景
递归模拟,防止递归深度过深,深度优先搜索模拟。
8.pair
头文件及使用
#include<utility>
using namespace std;
//map实现中涉及pair,使用map时自动添加了该头文件
pair<typename1,typename2> name;
pair<string ,int > p("hahahah",7);
make_pair("haha",4);
cout<<p.first<<" "<<p.second;
【pat】C++之刷题常用STL容器整理的更多相关文章
- 刷题常用的STL容器总结
本文归纳总结刷题常用到STL容器以及一些标准算法,主要包括: string.vector.map.pair.unordered_map.set.queue.priority_queue.stack,以 ...
- Sublime Text3 配置C++(附oj刷题常用模板)
# 下载对应平台的sublime sublime最新版下载, 字体样式个人喜欢Consolas, 另附注册码: -– BEGIN LICENSE -– TwitterInc 200 User Lice ...
- PAT甲级训练刷题代码记录
刷题链接:https://www.patest.cn/contests/pat-a-practise 1001 #include <iostream> #include <stdio ...
- ACM常用STL容器
// STL(标准模板库),由三大部分组成:容器,算法,迭代器 // STL六大组件:container(容器),algorthm(算法),iterator(迭代器) // function obje ...
- C++ 刷题常用函数总结
平时常用C++刷一些算法题,C++内置了许多好用的工具函数,但时间一长总是容易忘记,这里简单做一下总结,方便复习! <stdlib.h> atoi(const char* str) 将一串 ...
- ACM刷题常用链接
武汉科技大学 http://acm.wust.edu.cn/ 华中科技大学 http://acm.hust.edu.cn/vjudge/toIndex.action 杭州电子科技大学 http:/ ...
- Java刷题常用API
目录 输入输出 快速查看 最大最小值 string stringbuilder 集合 map queue stack set 优先队列 PriorityQueue (Heap) 数组 静态数组 动态数 ...
- STL容器整理
1.vector c++STL中的可变长度数组,主要支持操作有:建立,添加到末尾,返回长度,调整大小,定义迭代器及对迭代器的具体操作.具体如下: 1.建立一个元素类型为int的可变长度数组v,最开始N ...
- java刷题时常用容器详解
当初学java时,只是简单的把java基础知识过了一遍就跑去刷题了,很多知识都是在刷题的过程中慢慢加深理解的. 由于每次刷题时,刷到与容器有关的我基本上都跑去百度了,例如百度一下:java中List的 ...
随机推荐
- Nginx代理缓存功能
Nginx代理缓存功能 Nginx缓存主要是用于减轻后端服务器的负载,提高网站并发量,提升用户体验度. 注意:Nginx反向代理的缓存功能是由ngx_http_proxy_module提供, ...
- Springboot Activiti6 工作流 集成代码生成器 shiro 权限 vue.js html 跨域 前后分离
官网:www.fhadmin.org 特别注意: Springboot 工作流 前后分离 + 跨域 版本 (权限控制到菜单和按钮) 后台框架:springboot2.1.2+ activiti6.0 ...
- SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载)
场景 SpringCloud学习之运行第一个Eureka程序: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/90611451 S ...
- Sqlite—数据库备份与恢复
数据库备份 例如:备份 /www/wwwroot 下面的 task.db 数据库 1.进入数据库 [root@localhost ~]# sqlite3 /www/wwwroot/task.db 2. ...
- React 组件的生命周期方法
React 组件的生命周期方法 按渲染顺序: 1: componentWillMount() – 在渲染之前执行,在客户端和服务器端都会执行. 2: componentDidMount() – 仅在第 ...
- 关于c# winform 键盘响应右边键盘消息响应事件的上下左右方向键没有反应
原文作者:aircraft 原文链接:https://www.cnblogs.com/DOMLX/p/11835642.html 记录一下这个小坑,c# winform 键盘响应右边键盘的上下左右方向 ...
- HALCON数据类型和C#对应数据类型的对比
摘要:HALCON数据类型:Iconic Variables(图形变量).Control Variables(控制变量).在C#中,图形变量用HObject声明,控制变量用HTuple声明.(halc ...
- 为什么学习Python?
互联网高速发展的今天,很荣幸能够接触计算机这个专业,成为一名程序猿小白,本科期间学习了C.C++.Java.Pthon.C#,每门语言都了解那么一点,学的很杂,刚好遇到大学毕业的这个暑期,在继续读研之 ...
- DevExpress MVVM<1>
DevExpress MVVM 概念 模型 -定义数据和您的业务逻辑. 视图 -指定UI,包括绑定到ViewModel中的属性和命令的所有可视元素(按钮,标签,编辑器等). ViewModel-连接模 ...
- centos 下安装rabbitmq
1.先安装下依赖环境 yum install gcc glibc-devel make ncurses-devel openssl-devel xmlto 2.到earlang 官网下载erlang包 ...