竞赛中的STL库函数使用

ACM 的正确入门方式是什么? 想要入门ACM,首先你要有一定的编程基础,一般国内的ACM选手都是用C++的,所以C++的基本语法你应该有所了解。 1、库函数的了解 包括但不限于这些库(头文件):基本输入输出 如cstdio, iostream,以及一些从C的库弄过来的像cstring, cctype,cmath等库,具体可以随便百度一个人的代码,然后看看他的头文件 2、基础知识 如int的最大值是多少?int占多少内存?逻辑运算,循环等,不一一赘述。值得一提的是位运算,应当了解电脑中数据的存储方式,很多时候利用位运算帮助做. 阅读详情

简单的介绍一下STL的用法 看起来内容很多 只要遇到对应的题写个几题 很容易就熟能生巧了

为何cpp是竞赛使用最为广泛的语言呢 1 速度快 2 STL强大 因此掌握好STL 一定能让你做题的效率更上一层楼

Vector

介绍

​ 你可以把vector当做一个动态的数组 长度可扩容 且在main里开vector是开在堆空间的

​ 初始化

//需要头文件 #include <vector>

vector<int> q;
vector<node> q;

//定义长度
vector<int> q(n);
vector<int> q(n, 0);//定义长度并赋值

vector<int> a(n);
vector<int> b(a); //拷贝a到b

vector<int> q[5]; //行固定为5 列可以扩容
vector<vector<int> > q;//二维均可扩容
vector<vector<int> > q(n, vector<int>(m)); //初始化行为n 列为m

​ 遍历

直接访问下标(不越界时)	cout << q[3];
for(int i = 0; i < q.size(); i++)
	cout << q[i] << ' ';
for(auto x : q)	cout << x << ' ';
库函数
q.front();						返回第一个元素
q.pop_back();					删除最后一个元素
q.push_back();					在末尾加入一个元素
q.size();						返回容器长度	
q.clear();						清空容器			
q.insert(it, x);				在迭代器it处插入x	eg. insert(2, 1) 在q[2]插入1	
sort(q.begin(), q.end());		容器的始末地址				
q.empty(); <==> !q.size()		判空 空->真				

Stack

介绍

​ 特点:先进后出,后进先出

​ 初始化

#include <stack>

stack<int> stk;
stack<node> stk;

​ 遍历

​ 栈不能直接遍历 只能一个一个出栈

while(stk.size())	res[i ++] = stk.top(), stk.pop();

​ 数组模拟栈 可以跑得更快吧

int stk[100];
int cnt = 0;
void push(int x)	{stk[++ cnt] = x;}
void pop()			{cnt --;}
int top()			{return stk[cnt];}
库函数
stk.push();				将元素压入栈顶							
stk.top();				得到栈顶元素						
stk.pop();				删去栈顶元素			
stk.size();				返回栈内元素个数					
stk.empty();			判空								

Queue

介绍

​ 队列是一种先进先出的数据结构

​ 初始化

#include <queue>
queue<int> q;

​ 数组模拟队列

int q[100];
int hh = 0, tt = -1; //队头和队尾
void push(int x)	{q[tt ++] = x;}
void pop()			{if(tt >= hh)	++ hh;}
int front()			{return q[hh];}
bool empty()		{return tt >= hh;}
库函数
q.push()			在队尾插入一个元素								
q.pop();			在队头删除一个元素		
q.front();			返回队头	
q.back();			返回队尾							
q.size();			长度								
q.empty();			判空		

Deque

介绍

​ 双端队列 跟队列的区别就在于 双端队列的头和尾都可以进行插入和删除操作

​ 初始化

#include <deque>
deque<int> dq;

​ 双端队列可以排序,等同vector写法

库函数
push_back()/push_front();		队尾插入队头插入
pop_back()/pop_front();			删尾删头
back()/front();					获得尾和头元素
erase(it);						删去it所指元素
erase(it fisrt, it last);		删去[fisrt, last)所指元素
empty();						判空
size();							长度
clear();						清空

Priority_queue

介绍

​ 底层由堆来实现 可以在每次增删改查的时候维护序列有序 时间复杂度是nlgn

​ 初始化

#include <queue>
priority_queue<int> q;(大根堆)
priority_queue<int, vector<int>, greater<int> > q;(小根堆)

​ 自定义排序

greater<xx>	表示数字小的优先级大
less<xx> 	表示数字大的优先级大
cmp可以来代替greater等放在第三位置
如果是结构体的话 可以重载来更改规则
但是有一点很重要 就是优先队列的排序规则跟sort是相反的 //被狠狠地坑过
库函数
top();				队头
push();				压入
pop();				删头
size();				长度
empty();			判空

Map

介绍

​ 对于map 我们可以理解他为函数中的映射 且为单射 每个key对应一个value

​ 对于map中的元素 会被自动排序 以key的顺序来小到大排序 所以插入查询的复杂度是nlgn

​ 还有两种map

​ unordered_map 只做映射不做排序 所以插入和查询都是O1的 但是会被卡 也就是说 在时间宽裕的情况下最好使用map

​ multimap 一个键对应多个值的映射 可重版map

​ 初始化

#include <map>
map<int, int> mp;
map<string, int> mp;

​ 访问

mp[a] = b;
insert({xxx, xxx});
下标访问 cout << mp[x] << endl;
遍历
auto it = mp.begin();
while(it != mp.end()) //for(; it != mp.end(); it ++)
{
	cout << it->first << ' ' << it->second << '\n';
	it ++;
}

for(auto x : mp)
	cout << x.first << ' ' << x.second << '\n';

for(auto [k, v] : mp) //C++17
	cout << k << ' ' << v << '\n';
库函数
mp.find(key)			返回键为key的迭代器 若不存在 返回mp.end() 一般用于定位
mp.erase(it)			删除迭代器it所指的键与值O(1)
mp.erase(key)			根据映射来删除键与值O(lgn)
mp.erase(first, last)	删除左闭右开区间内的迭代器所指值O(n)
mp.size()				长度
mp.clear()				清空O(n)
mp.insert()				插入 需要构造键值对
mp.empty()				判空
mp.begin()				返回指向mp的第一个迭代器(地址)
mp.end()				返回指向mp尾部的结束迭代器(主要是最后一个元素的下一个地址)
mp.rbegin()				返回指向mp的最后一个迭代器(地址)
mp.rend()				返回指向mp的第一个迭代器(地址)
mp.count(key)			判断key是否存在,存在真

Set

介绍

​ set表示一个集合 该容器内元素不会重复 并自动排序 由于需要排序 所以插入和查询的复杂度是nlgn

其他set

​ mulitset: 可重集合 依然有序

​ unordered_set: 集合 且无序

​ unordered_mulitset: 可重集合 且无序

​ 初始化

#include <set>
set<int> s;

​ 访问

有无set存储的是集合 所以我们是不能通过索引来直接访问的
for(auto x : s)
	cout << x << '\n';
想要访问单体的话 可以使用指针
eg 访问最后一个元素cout << *(--s.end()) << '\n';
库函数
s.begin();				返回指向s的第一个迭代器(地址)
s.end()					返回指向s尾部的结束迭代器(主要是最后一个元素的下一个地址)
s.rbegin()				返回指向s的最后一个迭代器(地址)
s.rend()				返回指向s的第一个迭代器(地址)
s.clear();				清空
s.empty();				判空	
s.insert();				插入
s.size();				长度	
mp.erase(it);				删去当前迭代器所指元素
mp.erase(first, last);		删去区间[first, last)所指元素						
s.find();				查找某一元素 返回其迭代器 若不存在 则返回结束迭代器		
s.lower_bound();		返回大于等于k的第一个元素的迭代器	
s.upper_bound();		返回大于k的第一个元素的迭代器			

Pair

介绍

​ 你可以把pair当做两个元素的结构体 用于与其他数据结构组合

​ 初始化

pair<string, int> p;
pair<string, int> p("CCPC", 1);
//p = {"CCPC", 1};
typedef pair<int, int> PII; typedef pair<string, int> PSI;
vector<PII> q

​ 访问

PII p[20];
for(int i = 0; i < n; i++)
	cout << p[i].first << ' ' << p[i].second;

String

介绍

​ string是字符串类 类似于char数组 但是在char数组的基础上添加了很多简便的用法

​ 初始化

#include <string>
string s;
string s("ASASDFAS"); //直接生成s = "ASASDFAS"
string s("s", start, length); //pos默认为0 length默认为s.size() - pos 
string s("123456", 1, 3); //s = "234"
string s(5, '2');	//s = "22222"

​ 访问

可以直接输出整个字符串
cout << s;
也可以遍历输出单个字符
for(int i = 0; i < s.size(); i++)
	cout << s[i] << ' ';

​ string比起字符数组的特性

可以直接用+拼接字符串
用比较符号可以直接比较大小(字典序) 或者判断相等
string的读入
cin >> s;
用cin读入字符串 遇到空格和回车就会结束
aaa ss dd
cin >> s;
s = "aaa";

getline(cin, s);
读入一行字符串 	
aaa ss dd
getline(cin, s);
s = "aaa ss dd";

!!!需要注意的是 若是多行读入 getline会吃下前一行输入的换行符 需要用getchar吃掉换行符
eg
2 
a c m
	Wrong:	
		cin >> n;
     	getline(cin, s);
     	s == "";
    Right:
    	cin >> n;
    	getchar();
    	getline(cin, s);
    	s == "a c m";
    
当数据量特别大 但这题要用string处理的时候 可以加速一下读入输出
ios::sync_with_stdio(false);cin.tie(0);
!!!注意 当加速后 不能与scanf printf getchar getline()混用 只能使用cin&cout
库函数
s.size();						长度
s.push_back(char);				在字符串后插入一个字符
s.insert(pos, char);			在pos位置插入字符
s.erase(it);					删去迭代器it所指元素
s.erase(first, last);			删去区间[first, last)内所指元素
s.erase(pos, length);			删去从索引pos开始的长度为length的字符串
s.clear();						将s重置为"\0"
s.substr(pos, n);				截取从索引pos开始的n个字符

s.find(str, pos); 				在索引pos位置(默认为0)开始 查找 字符串/字符 str
s.rfind(str, pos);				在索引pos位置(默认为s.size() - 1) 开始查找 str
//找到后返回其索引 而返回-1表示没有找到 

Bitset

介绍

​ bitset是一个只能由0或1组成的数字 每个元素占用1bit

​ 初始化

#include <bitset>
bitset<n> a;			长度为n 每一位默认为0
bitset<9> bs(12); 		将12转化为二进制保存 在前面补0直至9位
bitset<10> bs("10101");	保存字符串 并 补前导0

​ 访问

与字符串很类似 可以直接输出或者用下标访问

​ 特点

可以直接对bitset进行位运算操作
eg
	bitset<4> a;
	bitset<4> b;
	a &= b;
	a ^= b;

所学尚浅 若有错误 请指正 以免误人子弟 感谢观看

【内容补充】C++ STL库函数总结(纯手打,主要偏向ACM竞赛方面使用) C++ STL库函数总结(纯手打,主要偏向ACM竞赛方面使用) 本资源为http://download.youkuaiyun.com/download/zjw1111/9840082的更新版本,对内容进行了补充。 立即下载

相关推荐

C++标准库函数(STL)参考手册

C++ 标准库函数(STL)的参考手册。 chm格式,虽然是英文,但是感觉很不错,比大家常看到的c/c++参考中的STL部分多出了算法那一块的函数,还有其他许多。大家自己看吧!!推荐,我找了一晚上找到的!

【C++】蓝桥杯必备 算法竞赛常用STL万字总结

C++ STL标准库 常用函数总结 算法竞赛必备

Remember who you are! 4万+

补洞与fairing算法

对网格进行补洞,remesh, 平滑,fairing, 最小二乘优化平滑

闪电彬彬的博客 1047

STL总结——经常使用的库函数

1.排序(必须加上这句话using namespace std;) 头文件:algorithm 语法描述为: sort(begin,end),表示一个范围 eg1: #include &lt;algorithm&gt; using namespace std; int main() { int a[20]={2,4,1,23,5,76,0,43,24,65}...

bggl的博客 512

AFSim编译一:windows

AFSim在windows上的编译

Meepo的博客 4734

快速入门:使用 SQL Server Management Studio (SSMS) 连接和查询 SQL Server 实例

开始使用 SQL Server Management Studio (SSMS) 连接到 SQL Server 实例并运行一些 Transact-SQL (T-SQL) 命令。本文介绍如何连接和查询实例SQL Server。有关 Azure SQL,请参阅连接。若要使用,请参阅连接和查询。若要详细了解如何SQL Server Management Studio,请参阅其他。......

m0_72938729的博客 5727

Android NDK中的c++ STL

Android 下的标准C++ stl支持

whl0071的专栏 1272

ABB AC500 系列 PLC 与上位机iFix 的通讯配置

在 软件中,有 3 种方式可以进入 IP config tool 的配置界面 双击 IP_settings,点击 IP config tool,即可进入 IP config tool 界面点击菜单栏的 Tool→IP config如果单独安装了 ABB IP Configration,则可以通过开始→程序→ABB→ABB IPConfigration 启动 IP 配置工具启动 IP config tool 后,即可进入 IP 配置界面。

xdpcxq的专栏 4028

【安卓随笔】轻度自虐之使用CMake开发NDK(案例:YUV转RGB)

Android Studio 2.2后,加入了对CMake的支持,从此AS开发NDK的能力和简便性得到了巨大的飞跃,本文就来介绍一下操作流程。 首先需要下载NDK的开发环境,打开Default Setting->Android SDK->SDK Tools,选中CMake,LLDB,NDK下载,如图所示: 然后我们新建一个工程,本文将用JNI实现YUV2RGB这个jing

vicemiami的博客 1236

DDR内存条选购避坑指南:单Rank vs 双Rank性能实测对比(附2024年颗粒推荐)

本文深入解析了内存条中单Rank与双Rank设计的原理与性能差异。通过实战测试对比,揭示了双Rank内存在高负载场景(如3D渲染、视频剪辑)中凭借Rank Interleaving技术带来的显著性能优势,并提供了2024年针对不同用户需求的DDR4/DDR5内存选购策略与避坑指南。

ik678901的博客 1122

uniapp - 详解使用高德地图在地图上实现绘制边界/点聚合/行政区域高亮等功能,Uniapp高德地图点聚合标记及绘制点线面示例代码(全端兼容H5网页、小程序、安卓app、苹果app、nvue)

uni-app,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,高德地图,uniAPP高德地图实现点聚合,地图区域描边、点标记、点信息详情弹窗,实现绘制边界区域,uniapp H5使用高德地图实现点聚合、行政区域高亮,实现高德地图的marker聚合功能,高德地图进行marker标点,点信息展示,点击标记点弹出对话框,点击聚合点后显示信息模态框,打标点,【Uniapp】高德地图的接入自定义标点与信息窗体使用,绘制行政区域边界,绘制多边形,电子围栏,高德行政区划边界,

✅ 精选推荐文章 1万+

算法竞赛中用过的STL\库函数

名称 功能 sort(a, a+n, cmp) 排序 upper_bound(a, a+n, key) 返回第一个大于key的元素的地址 lower_bound(a, a+n, key) 返回第一个大于或等于key的元素的地址 unique(a, a+n, myFun) - a 把不重复的元素移到前面来,使用前应先排序,可与erase实现去重 next_permut...

码上相逢 495

SKUA-GOCAD入门教程-第七节 点的创建与编辑3

本文介绍了四种从井数据创建点集的方法

江洋大葱的博客 963

[STL] 算法竞赛必备模块化工具库

算法竞赛必备STL常见库函数整理及相关拓展和应用 常见的语法错误都有提示

2402_86664733的博客 972

【Flink】FlinkCDC获取mysql数据时间类型差8小时时区解决方案

​ 1、背景: 在我们使用FlinkCDC采集mysql数据的时候,日期类型是我们很常见的类型,但是FlinkCDC读取出来会和数据库的日期时间不一致,情况如下 FlinkCDC获取的数据中create_time字段1694597238000转换为时间戳2023-09-13 17:27:18,而数据库中原始数据如下,并没有到下午5点,这就导致了FlinkCDC读出来的时间和数据库中实际的时间不一致的情况,与数据库对比可以发现,这里的时间戳与数据库时间刚好相差了 8 个小时,在实际生产中这种情况是不

一杯咖啡半杯糖的博客 3854

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

算法竞赛入门经典——暴力求解法

算法竞赛入门经典——暴力求解法 生成1~n的排列 void print_permutation(int n,int* A,int cur){ if(cur==n){ for(int i=0;i<n;i++){ printf("%d ",A[i]); } printf("\n"); } else{ for(int i=1;i<=n;i++){ int o...

linjiayina的博客 471

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

算法竞赛入门经典读书笔记(三)7.2枚举排列

7.2.1生成1~n的所有排列 递归调用的方法可以实现。 #include using namespace std; void print_permutation(int n,int *A,int cur){ int i,j; if(cur==n){ for(i=0;i<n;i++) cout<<A[i]; cout<<endl; } else for(i=1;i<=n;i++){ i

GinSmile的博客 1410

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

c++算法初解—卷(1)

例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考例如:以上就是今天要讲的内容,本文仅仅简单介绍了pandas的使用,而pandas提供了大量能使我们快速便捷地处理数据的函数和方法。

weixin_54507065的博客 1845

第十四届蓝桥杯临考备赛(临阵磨枪了啊!!难受难受)

-----》这就是比较高效且简单的二分查找算法,使用前必须保证数组是有序的,时间复杂度是logn,函数比较简单,使用方法和上诉的qsort差不多,只不过要查找的元素必须先用一个变量存一下,然后将这个变量的地址传给bsaerch,bsearch的返回值是个指针,要想获取到待查元素的下标,只需用该地址减去数组首地址即可(获取地址时不要忘了强转!言归正传,C++中的vector在蓝桥杯中也就用到几个基本操作,比如创建及初始化,在数组尾部插入和删除元素,遍历该动态数组,修改数组中元素的值(和数组的用法一样)。

m0_58582343的博客 208

算法入门经典:大理石在哪儿

大理石在哪儿(where is the marble? , UVa 10474) 前言:好好努力,在研一参加一次关于ACM竞赛,完成本科的期望。 问题: 现有N个大理石,每个大理石上写了一个非负整数、首先把各数从小到大排序;然后回答Q个问题。每个问题问是否有一个大理石写着某个整数x,如果是,还要回答哪个大理石上写着x。排序后的大理石从左到右编号为1~N。 (

MissXy_的博客 2419

C++ 算法竞赛的常用库函数

C++ 算法竞赛的常用库函数 算法竞赛赛前复习必备

Yvonne_78的博客 5525

盘点算法竞赛中C++常用的stl库函数

next_permutation()用于生成当前序列的写一个序列,按照字典序对序列重新进行排列,如果存在下一个序列,就将当前序列改为下一个序列,并返回true,如果当前序列就是最后一个序列,就将序列改为第一个序列,并返回false。这个函数的作用就是进行部分排序,返回值为void,传入的是3个地址或迭代器,排序之后, k 的处于正确的位置,其他元素可能是任意的,也就是不一定有序,但是k前面都是比k小的,后面都是比k大的。这是一个二分查找的库函数,用于在已排序的序列(数组,容器等)中查找元素,返回值为。

2202_76097976的博客 1857

掌握ACM竞赛利器:C++ STL库函数总结

掌握ACM竞赛利器:C++ STL库函数总结 【下载地址】CSTL库函数总结纯手打面向ACM竞赛分享 本资源是一份精心整理的C++标准模板库(STL)函数汇总,特别适用于参与算法竞赛(如ACM国际大学生程序设计竞赛)的开发者和学习者。这份文档完全由人工编写,旨在提供一个简洁明了、针对性强的学习和参考工具。它不仅覆盖了ST...

gitblog_06656的博客 445

【亲测免费】 C++ STL库函数总结(纯手打,面向ACM竞赛)

C++ STL库函数总结(纯手打,面向ACM竞赛) 【下载地址】CSTL库函数总结纯手打面向ACM竞赛分享 本资源是一份精心整理的C++标准模板库(STL)函数汇总,特别适用于参与算法竞赛(如ACM国际大学生程序设计竞赛)的开发者和学习者。这份文档完全由人工编写,旨在提供一个简洁明了、针对性强的学习和参考工具。它不仅覆盖...

gitblog_06652的博客 814

C++STL在算法竞赛中的应用详解

本篇博客详细讲述C++的STL中的内容在算法竞赛中的作用,包括数据类型和常用函数

yxc_71411的博客 1404

竞赛常用STL容器详解

在算法竞赛中,使用C++语言的占很大比例,而几乎没有人使用C语言,其中核心的原因就是C++包含STL容器库,能够极大地减少选手在赛场上为了一些基础数据结构而浪费的时间。如果可以的话,我们总是希望不要手写红黑树、动态数组的。那么STL容器库的出现就像雪中送炭一样了。它们覆盖了竞赛中最基础的需要(张昆玮树、主席树这种东西肯定不会包含的),让你在面对非数据结构题的时候能够不因数据结构部分的代码而分心。 关于STL容器的相关问题非常细,经常成为面试中的考题,这里我们仅讨论一些必须的内容,然后只谈论在竞赛中的具体使用

zclll的博客 1475
上一篇: AtCoder #ABC 245
下一篇: 2022 04 05学习记录
a simple_boy
博客等级 码龄5年 1粉丝 50原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值