对于C++STL及其时间复杂度的总结

由于本次在山东CCPC邀请赛中,对于堆的时间复杂度记忆不清晰,导致第4题没有做出来,与铜牌失之交臂,故觉应整理STL的时间复杂度。

本文仅整理有用(竞赛)的stl及其用法,并且不阐述过于基础的内容。


vector

头文件#include<vector>

vector开在局部或者全局都是开的堆空间,不会爆栈。
也就是说你能把vector开到1e18的长度都没事。

函数

1.vec.front();	//返回第一个元素,时间复杂度O(1)2.vec.back();	//返回最后一个元素,时间复杂度O(1)3.vec.pop_back();	//删除最后一个元素,O(1)4.vec.push_back(x);	//在尾部加入一个元素x,O(1)5.vec.size();	//返回vec的长度,O(1)6.vec.begin();	//返回vec的起始位置7.vec.end();	//返回vec的结束位置加一个位置8.vec.empty();	//返回vec是否为空9.vec.clear();	//清空vec,**O(N)**
如果要清空二维vec,就需要循环行数进行clear10.vec.inesrt(pos,x);	//在下标pos出插入x元素,**O(N)**
其中pos必须以这样的格式:vec.begin() + n,即插入到n位值(下标从0开始)11.vec.erase(start,end);	//删除[first,end)范围内的元素,**O(N)**

创建一维vector

1.普通的创建
vector<数据类型> vec;2.指定长度和初始值的创建
vector<数据类型> vec(长度)	//长度被指定,默认值为0
vector<数据类型> vec(长度,默认值);		//长度与默认值被指定3.创建默认有多个元素的vector
vector<数据类型> vec{1,值2,值3};	//创建了长度为3,并填充了三个指定值的vector4.复制创建
(1).
vector<int> a;
vector<int> b(a);	//创建出和a有相同数据类型,相同长度,相同初始值的vector,不实用
(2).
vector<数据类型> b = a;	//相当于把a数组赋给了b,数据类型要保证相同

创建二维vector

1.指定行数的二维vector
vector<数据类型> vec[N];		//行数不可扩展只能为N,列数可扩展,vec[1]就相当于一个普通一维vector2.行列均可变化的二维vector
vector<vector<数据类型>>vec;	//行和列均可扩展,但是必须push_back进去一个完整的数组3.指定行列和默认值
vector<vector<数据类型>> vec(行,vector<数据类型>(列,0));

stack(不如数组模拟)

头文件#include<stack>

创建

stack<数据类型>s;

函数

1.s.push(x);	//将x压入栈中,O(1)2.s.pop();		//弹出栈顶,O(1)3.s.top();		//返回栈顶元素,O(1)4.s.empty();	//返回栈是否为空,O(1)5.s.size();		//返回栈元素个数,O(1)

无法直接遍历栈,必须一个个弹出来遍历,当然不如直接用数组模拟能够直接遍历。


queue

头文件#include<queue>

创建

queue<数据类型>q

函数

均为O(1)时间复杂度

1.q.front();	//返回队首元素2.q.back();3.q.push(x);4.q.pop();5.q.size();6.q.empty();

deque

头文件#include<deque>

创建

deque<数据类型>q;

函数

1.q.push_back(x)/q.push_front(x)	//压入首/尾,O(1)2.q.back()/q.front()	//返回首/尾元素,O(1)3.q.pop_back()/q.pop_front()	//O(1)4.q.erase(pos)/q.erase(st,ed)		//删除pos处元素或删除[st,ed)的元素,**O(N)**5.q.empty()	//O(1)6.q.size()	//O(1)7.q.clear()	//**O(N)**8.q.insert(pos,x)	//**O(N)**

priority_queue

头文件#include<queue>

创建

priority_queue<int>heap 或 priority_queue< int,vector<int>,less<int> >heap;		//大根堆,top是最大
priority_queue< int,vector<int>,greater<int> >heap;								//小根堆,top是最小

创建对结构体的优先队列时,需要在结构体内定义好排序规则(重载运算符)

struct Node{int a,b;bool friend operator <const	(Node &A,Node &B){return A.a < B.a;}
};

函数

牢牢记住优先队列的两个logN,血的教训

1.q.top()		//返回堆顶元素,O(1)2.q.push(x)		//压入x元素,**O(logN)**3.q.pop()		//弹出x元素,**O(logN)**4.q,size()		//返回堆中元素数量,O(1)5.q.empty()		//O(1)

map/unordered_map

头文件#include<map>#include<unordered_map>
map基于红黑树,unordered_map基于哈希表
map按照值排序,unordered_map不排序
map的指引可以分成两种,第一种是迭代器,就是下标,第二种是键。
基础用法不赘述

创建

map<数据类型(键),数据类型(值)>map

函数

1.m.find(x)	//返回值为key的键,如果没有就返回最后一个下标的下一个值,**O(logN)**2.m.erase(pos)	//删除pos位置的键及其值,O(1)3.m.erase(key)	//删除key键及其值4.m.size()		//返回已经存入了多少个键或值,O(1)5.m.clear()		//清空,O(N)6.m.insert({key,value})	//插入元素7.m.rbegin()	//返回最后一个元素的迭代器8.m.begin()		//返回第一个元素的迭代器9.m.count(key)	//查询是否存在键key10.m.lower_bound(x)	//返回键大于等于x的第一个键的迭代器,O(logN)11.m.upper_bound(x)	//返回键大于x的第一个键的迭代器,O(logN)

对于map,修改和查询都相当于对红黑树进行修改,即时间复杂度都为O(logN),而unordered_map的修改查询操作都接近O(1)


multimap

头文件#include<map>
与map不同的地方在于multimap可以存储多个相同的键及其对应的值

创建

multimap<数据类型(key),数据类型(值)>m

函数

1.m.count(key)	//返回键为key的键值对的个数2.m.emplace()	//指定位置构建键值对,比insert效率高

大多数函数与map相同,值得注意的是,multimap不能通过直接给出键来查询值。


set/unordered_set

头文件#include<set>以及#include<unordered_set>
并且也有multiset

创建

set<数据类型>s

函数

1.s.begin()		//返回第一个元素的迭代器,O(1)2.s.rbegin()	//返回最后一个元素迭代器,O(1)3.s.clear()		//清空,O(N)4.s.empty()		//O(1)5.s.insert()	//O(logN)6.s.size()		//O(1)7.erase(key)	//删除键为key的值,O(logN)8.s.find(x)		//查找x,并返回迭代器,O(logN)9.s.count(x)	//查询x是否出现过,O(logN)10.s.lower_bound(x)		//返回大于等于x的第一个元素的迭代器,O(logN)11.s.upper_bound(x)		//返回大于x的第一个元素的迭代器,O(logN)

set可以改变排序方式

set<int>s	//从小到大set<int,greater<int>>s	//从大到小

string

头文件#include<sring>

特性

支持比较运算符,即可直接按照字典序比较两个字符串,并且更长的更大。

两个字符串可以直接用加法运算法加起来

读入

cin >> str遇到空格就停止
getline(cin,s)遇到换行符停止

函数

1.s.size()/s.length()	//返回长度2.s.insert(pos,x)	//在pos位置插入字符串x3.s.push_back(x)	//在结尾插入字符x,效率较高4.s.erase(pos)		//删除pos处的字符5.s.erase(st,ed)	//删除[st,ed)中的字符6.s.clear()			//清空7.s.replace(pos,len,str)	//从pos开始的长度为len替换为字符串str8.s.replace(pos,len,cnt,c)	//从pos开始的长度为len替换为cnt个字符c9.s.replace(it1,it2,str)	//把从[it1,it2)替换为str10.tolower(s[i])		//字符s[i]变为小写11.toupper(s[i])		//字符s[i]变为大写12.s.substr(pos,len)	//截取从pos开始,长度为len的字符串13.s.find(str,pos)		//从pos开始查找字符串str或字符14.s.rfind(str,pos)		//从pos倒着找字符串str或字符

bitset

头文件#include<bitset>
只能存0和1

创建

1.bitset<n>a	//创建n位,每一位都是02.bitset<n>a(s)	//用string类型创造bitset

特性

可以像二进制数一样进行位运算

函数

1.b.any()		//返回b中是否有1的数位2.b.none()		//返回b中是否没有1的数位3.b.count()		//返回b中1的个数4.b.size()		//返回二进制位有多少5.b[pos]		//直接查询pos数位是什么数6.b.set()		//把b所有数位设为17.b.set(pos)	//把pos数位设为18.b.reset()		//b所有数位设为09.b.reset(pos)	//bpos数位设为010.b.flip()		//b的所有二进制数位取反11.b.flip(pos)12.b.to_ulong()	//用b返回一个unsigned long值

array

头文件#include<array>
大小固定,更像普通数组,比vector快

创建

1.array<数据类型,len>a;	//开一个len长度的,但是默认值不确定2.array<数据类型,len>a{};	//开一个len长度的,默认值为0

函数

1.a.begin()		//返回第一个元素的迭代器2.a.end()		//返回最后一个元素后一个位置的迭代器3.a.rbegin()	//返回最后一个元素的迭代器4.a.size()		//返回a的长度5.a.at(n)		//返回a[n]6.a.front()		//返回第一个元素7.a.back()		//返回最后一个元素8.a.data()		//返回一个指向a的第一个元素的指针9.a.fill(x)		//用x给a初始化10.a1.swap(a2)	//交换相同长度的a1和a2的所有元素11.fill(st,ed,x)//初始化[st,ed)为x12.get<n>(a)	//相当于a[1],并且n只能为具体数字

STL函数

这里有众多神器啊

__builtin_ffs(x)

返回x的二进制数位中从后往前找的第一个1所在的位置。

__builtin_popcount(x)

返回x的二进制形式中1的个数

__builtin_ctz

返回x的二进制形式中末尾0的个数(从后往前第一个1之后的)

以上函数都可以在结尾出加上ll来转化为对long long的函数

accumulate(a + st,a + ed,original) O(N)

对取件[st,ed]以original为初始值来求和
并且可以定义函数来定义对结构体的求和方式

atoi(char*) / stoi(string)

把字符串转化为int

fill(a + st,a + ed,value) O(N)

对数组把[st,ed]范围内转化为value值

is_sorted(a + st,a + ed) O(N)

判断数组在[st,ed]范围内是否排序好了

lower_bound(a+st,a+ed,target) / upper_bound(a+st,a+ed,target) O(logN)

在范围内lower_bound查找第一个大于等于target的值,upper_bound查找第一个大于target的值

max_element(a+st,a+ed) / min_element(a+st,a+ed)O(N)

返回数组在范围内的最大值和最小值

nth_element(a+st,a+nth,a+ed)O(N)

返回数组在范围内第nth小的值

next_permutation(a + st,a + ed)O(N)

求下一个字典序大一的排列,并且有返回值,如果是最大的排列就返回false

```prev_permutation(a + st,a + ed)````O(N)

求下一个字典序小一的排列,并且有返回值,如果是最小的排列就返回false

stable_sort()O(NlogN)

与sort一样,只不过不会改变大小相同的元素的位置

to_string

将整数或小数转化为字符串

unique()O(N)

去重

__lg(x)O(1)

l o g 2 x log_2x log2x 下取整

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/19867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux服务器配置GroundingDINO 详细过程

linux服务器配置GroundingDINO 详细过程 1. 参考帖子2. 配置流程&#xff1a;环境配置&#xff1a;py310, cuda118, pytorch2.12.1 设置相关的环境变量&#xff1a;2.2 配置conda下载anaconda 配置相对应的环境 1. 参考帖子 已经跑通了&#xff0c;该踩的坑也都踩过来了&#…

MOE模型入门

一、目录 定义&#xff1a;MOE架构代表类型如何解决expert 平衡的&#xff1f;而不是集中到某一专家。如何训练、微调MOE模型&#xff1f;基础架构优缺点不同MOE 模型实现方式、训练方法 二、实现 定义&#xff1a;MOE架构 MOE:混合专家模型&#xff0c;多个专家共同决策的模…

Redis 探索之旅(进阶)

目录 今日良言&#xff1a;从不缺乏从头开始的勇气 一、持久化 1、RDB 2、AOF 二、Redis 的事务 三、主从复制 四、哨兵模式 五、集群模式 六、缓存 七、分布式锁 今日良言&#xff1a;从不缺乏从头开始的勇气 一、持久化 持久化就是把数据存储在硬盘上&#xff0c;无…

SQL 入门:使用 MySQL 进行数据库操作

SQL 入门&#xff1a;使用 MySQL 进行数据库操作 目录 引言SQL 基础 SQL 语言概述MySQL 简介 数据库设计基础 数据库与表的设计常见数据类型 MySQL 安装与配置 安装 MySQL基本配置与连接 基本 SQL 语句 数据库的创建与删除表的创建、修改与删除数据插入、更新与删除 数据查询…

CUDA学习(2)

什么是CUDA CUDA&#xff08;Compute Unified Device Architecture&#xff09;&#xff0c;统一计算设备架构&#xff0c;英伟达推出的基于其GPU的通用高性能计算平台和编程模型。 借助CUDA&#xff0c;开发者可以充分利用英伟达GPU的强大计算能力加速各种计算任务。 软件生…

保险 - day12 时序数据库influxdb

时序数据库 时序数据库是近几年一个新的概念&#xff0c;与传统的Mysql关系型数据库相比&#xff0c;它的最大的特点是&#xff1a;数据按照时间顺序存储。举例来说&#xff0c;日志数据&#xff0c;是以时间顺序存储的&#xff0c;所以用时序数据库存储是一种很好的选择。使用…

【stm32】stm32f407 ch340下载

一、接线 1、ch340 Vcc短接3v3 5v---------5v GND-----GND TX ------RX RX --------TX 2、stm32F407 如上图&#xff0c;我们需要进入isp下载模式&#xff0c;接线图如下 二、下载 使用FlyMcu选择你要下载的程序文件中的.hex文件&#xff0c; 然后配置图如下&#xff1…

Visual Studio的桌面快捷方式图标不显示

1.问题描述 以下以Visual Studio 2019举例&#xff0c; 正常图标&#xff1a; 但是当前Visual Studio的桌面快捷方式图标不显示了&#xff1f; 2.问题原因分析 Visual Studio 2019桌面快捷方式图标不显示可能由以下几个原因造成&#xff1a; 图标缓存问题&#xff1a;Windo…

解析《动物园规则怪谈》【逻辑】

鉴赏《动物园规则怪谈》【逻辑】 前言版权推荐鉴赏《动物园规则怪谈》推理游客正方“它”方其他物品 不同规则或纸条的对比联系出现的地方及联系游客入园历程&#xff1a;被“它”污染的过程鉴赏升华 最后 前言 2024-5-31 13:05:38 以下内容源自《【逻辑】》 仅供学习交流使用…

rnn 和lstm源码学习笔记

目录 rnn学习笔记 lstm学习笔记 rnn学习笔记 import torchdef rnn(inputs, state, params):# inputs的形状: (时间步数量, 批次大小, 词表大小)W_xh, W_hh, b_h, W_hq, b_q paramsH stateoutputs []# 遍历每个时间步for X in inputs:# 计算隐藏状态 HH torch.tanh(torch.…

五种主流数据库:常用数据类型

在设计数据库的表结构时&#xff0c;我们需要明确表中包含哪些字段以及字段的数据类型。字段的数据类型定义了该字段能够存储的数据种类以及支持的操作。 本文将会介绍五种主流数据库中常用的数据类型以及如何选择合适的数据类型&#xff0c;包括 MySQL、Oracle、SQL Server、…

【Linux】从零开始认识进程间通信 —— 共享内存

送给大家一句话&#xff1a; 吃苦受难绝不是乐事一桩&#xff0c;但是如果您恰好陷入困境&#xff0c;我很想告诉您&#xff1a;“尽管眼前十分困难&#xff0c;可日后这段经历说不定就会开花结果。”请您这样换位思考、奋力前行。 -- 村上春树 &#x1f506;&#x1f506;&…

[数据集][目标检测]打架检测数据集VOC格式3146张2类别

数据集格式&#xff1a;Pascal VOC格式(不包含分割的txt文件&#xff0c;仅仅包含jpg图片和对应的xml) 图片数量(jpg文件个数)&#xff1a;3146 标注数量(xml文件个数)&#xff1a;3146 标注类别数&#xff1a;2 标注类别名称:["nofight","fight"] 每个类别…

c# - 运算符 << 不能应用于 long 和 long 类型的操作数

Compiler Error CS0019 c# - 运算符 << 不能应用于 long 和 long 类型的操作数 处理方法 特此记录 anlog 2024年5月30日

PBR系列-物理材质(上)

作者&#xff1a;游梦 对PBR系列文章感兴趣还可以看前文&#xff1a; PBR系列 - 物理光源 PBR系列-光之简史 前面两篇文章分别介绍了物理光源与光学研究简史&#xff0c;在对光有了简单认识之后&#xff0c;再认识物理材质会发现其实本质上还是对光的研究&#xff0c;再深入…

python爬取每日天气情况

python爬取每日天气情况 一、项目简介二、完整代码一、项目简介 本次爬取的目标数据来源于天气网,数据所在的页面如下图所示,本次任务较为简单,按照正常操作流程操作即可,即抓包分析数据接口,发送请求获取数据,解析数据并持久化存储。发送请求使用requests库,解析数据使…

Spring Cloud Gateway通过配置文件方式提供路由服务

一、Spring Cloud Gateway的路由匹配规则 Spring Gateway支持两种方式提供路由服务&#xff0c;其一是配置文件启用&#xff0c;其二则是通过代码达到目的&#xff0c;此文章是通过配置文件方式 二、使用步骤 1.通过配置文件方式提供路由服务 yml配置如下&#xff08;示例&a…

CMake的原理与使用方法

一.为什么需要CMake&#xff0c;什么是CMake 1.由于各种make工具遵循不同的规范和标准&#xff0c;所执行的Makefile格式也不同&#xff0c;例如 GNU Make &#xff0c;QT 的 qmake &#xff0c;微软的 MS nmake&#xff0c;BSD Make&#xff08;pmake&#xff09;&#xff0c;…

C语言基础编程题目解析:探索逻辑与算法的奥秘

C语言基础编程题目解析&#xff1a;探索逻辑与算法的奥秘 在编程的世界里&#xff0c;C语言作为一门基础且强大的编程语言&#xff0c;其题目往往涵盖了丰富的逻辑和算法知识。下面&#xff0c;我们将从四个方面、五个方面、六个方面和七个方面&#xff0c;对一系列C语言基础编…

【3GPP IAB】NR IAB推荐架构

1 概述 3GPP所有提交给RAN-3 #99的IAB多跳设计都可以用五个架构参考图来表示。这些参考图的不同之处是需要对接口进行修改&#xff0c;或者需要额外的功能&#xff0c;例如完成多跳转发。这五个体系结构被分为两个体系结构组。这些架构的主要特点可以概括如下: 架构组1:由架构1…