当前位置: 首页 > news >正文

对于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 下取整

相关文章:

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

由于本次在山东CCPC邀请赛中&#xff0c;对于堆的时间复杂度记忆不清晰&#xff0c;导致第4题没有做出来&#xff0c;与铜牌失之交臂&#xff0c;故觉应整理STL的时间复杂度。 本文仅整理有用&#xff08;竞赛&#xff09;的stl及其用法&#xff0c;并且不阐述过于基础的内容。…...

Docker搭建FRP内网穿透服务器

使用Docker搭建一个frp内网穿透 在现代网络环境中&#xff0c;由于防火墙和NAT等原因&#xff0c;内网设备无法直接被外网访问。FRP (Fast Reverse Proxy) 是一款非常流行的内网穿透工具&#xff0c;它能够帮助我们将内网服务暴露给外网。本文将介绍如何在Linux服务器上使用Do…...

【NumPy】掌握NumPy的divide函数:执行高效的数组除法操作

&#x1f9d1; 博主简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟&#xff0c;欢迎关注。提供嵌入式方向…...

您的虚拟机未能继续运行,原因是遇到一个可纠正的错误。请保留挂起状态并纠正错误,或放弃挂起状态。

镜像&#xff1a;应急响应靶机 错误信息 此虚拟机的处理器所支持的功能不同于保存虑拟机状态的虚拟机的处理器所支持的功能。 从文件"E:\XXX.vmss"还原 CPU 状态时出错。 您的虚拟机未能继续运行&#xff0c;原因是遇到一个可纠正的错误。请保留挂起状态并纠正错误…...

FPGA DMA IP核使用指南

摘要 本文旨在介绍FPGA中DMA(Direct Memory Access)IP核的使用,包括其基本框架、测试代码编写以及仿真波形的分析。DMA是一种允许外围设备直接与内存进行数据交换的技术,无需CPU的介入,从而提高了数据传输的效率。 1. 引言 在现代FPGA设计中,DMA IP核因其…...

【博客20】缤果Matlab串口调试助手V1.0(中级篇)

超级好用的Matlab串口调试助手 开发工具: MATLAB 2024a中文版 (编程语言matlab) -> Matlab APP Designer 目录 前言 一、软件概要&#xff1a; 二、软件界面&#xff1a; 1.App演示 ​ ​---- ◇♣♡♠ ---- 2.其他扩展App展示 ​编辑 三、获取 >> 源码以及G…...

南京威雅学校:2024年度大戏《Tinkerbell(小叮当)》震撼落幕

三天连演三场 两小时十六幕高潮迭起的舞台故事 一百五十余名师生台前幕后全统筹 逾千名观众现场观演 四个城市五大平台同步直播 南京威雅2024年度大戏 《Tinkerbell&#xff08;小叮当&#xff09;》震撼落幕 它以商演级别的舞台设计 宏大而精密的舞台调度 直击心灵的…...

Kotlin 函数

文章目录 函数的定义函数的返回值参数默认值 & 调用时参数指定函数作用域Lambda 表达式匿名函数内联函数扩展函数中缀函数递归函数 & 尾递归函数 函数的定义 函数可以理解成一个小小的加工厂&#xff0c;给入特定的原材料&#xff0c;它就会给出特定的产品。 fun [接…...

动态路由协议实验——RIP

动态路由协议实验——RIP 什么是RIP ​ RIP(Routing Information Protocol,路由信息协议&#xff09;是一种内部网关协议&#xff08;IGP&#xff09;&#xff0c;是一种动态路由选择协议&#xff0c;用于自治系统&#xff08;AS&#xff09;内的路由信息的传递。RIP协议基于…...

数据结构 | 二叉树(基本概念、性质、遍历、C代码实现)

1.树的基本概念 树是一种 非线性 的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根…...

很多Oracle中的SQL语句在EF中写不出来

很多复杂的Oracle SQL语句在Entity Framework&#xff08;EF&#xff09;中很难直接表达出来。虽然EF提供了一种方便的方式来使用C#代码查询和操作数据库&#xff0c;但它在处理某些复杂的SQL特性和优化时可能会有局限性。 以下是一些在EF中可能难以直接实现的Oracle SQL功能和…...

浏览器打开PHP文件弹出下载而不是运行代码

说明 使用phpstudy&#xff0c;极少会出现这种情况。 这里主要是帮助大家理解&#xff0c;为什么上传的木马不运行。 问题原因 首先需要理解&#xff0c;访问PHP文件弹出下载&#xff0c;说明服务端的容器&#xff08;比如Apache或者Nginx&#xff09;把文件当成了一个普通二…...

安卓自定义UI组件开发流程

安卓自定义ui组件开发流程 开发安卓自定义UI组件的流程大致可以分为以下几个步骤&#xff1a; 确定需求和设计&#xff1a; 确定需要自定义的UI组件的功能和外观。设计组件的交互逻辑和视觉效果。 创建自定义组件类&#xff1a; 创建一个新的Java类&#xff0c;继承自View、V…...

【LINUX】LINUX基础(目录结构、基本权限、基本命令)

文章目录 LINUX的目录结构LINUX的基本权限LINUX基本命令 LINUX的目录结构 /&#xff1a;表示根目录bin&#xff1a;存放二进制可执行文件(命令ls、cat、mkdir等)boot&#xff1a;存放系统引导文件dev&#xff1a;存放设备文件etc&#xff1a;存放系统配置文件home&#xff1a;…...

Aigtek功率放大器的主要性能要求有哪些

功率放大器是电子系统中的重要组件&#xff0c;用于将低功率信号放大到高功率水平。功率放大器的性能直接影响到信号的放大质量和系统的整体性能。下面西安安泰将介绍功率放大器的主要性能要求。 增益&#xff1a;功率放大器应当具有足够的增益&#xff0c;即将输入信号的幅度放…...

2024.5.29晚训参考代码

因为本套题没有BFS例题&#xff0c;所以我先把BFS模板放着 #include<bits/stdc.h> using namespace std; int n,m;//n*m的棋盘 int dis[402][402]; bool vis[402][402]; int X[]{-2,-2,-1,-1,1,1,2,2};//偏移量的表 int Y[]{-1,1,-2,2,-2,2,-1,1};//定义一个数组&…...

【计算机网络】——概述(图文并茂)

概述 一.信息时代的计算机网络二.互联网概述1.网络&#xff0c;互连网&#xff0c;互联网&#xff08;因特网&#xff09;1.网络2.互连网3.互联网&#xff08;因特网&#xff09; 2.互联网简介1.互联网发展的三个阶段2.互联网服务提供者&#xff08;ISP&#xff09;3.互联网的组…...

C语言多个源程序编译的CMakeList文件编写/源程序生成动态库

1.编译多个源程序时CMakeLists文件编写 1.若源程序目录结构如下&#xff1a; main.cpp中include“LCD_2inch4.h”头文件&#xff0c;而LCD_2inch4.h中include其它源程序&#xff0c;则CmakeLists.txt文件可为如下&#xff1a; # 设置项目名称 cmake_minimum_required(VERSI…...

C# list集合

一、list集合基本使用 1.添加元素 ① 单个元素添加 List<int> list new List<int>();for (int i 0; i < 3; i){list.Add(i);}//输出&#xff1a;0,1,2 ②初始化时添加元素 List<int> list2 new List<int> { 1, 2, 3 };//输出&#xff1a;0,1…...

****三次握手和四次挥手

一、三次握手 1.简要描述TCP三次握手的过程 第一次握手&#xff0c;客户端发送SYN包到服务器&#xff1b; 第二次握手&#xff0c;服务器收到SYN包&#xff0c;回复一个SYNACK包&#xff1b; 第三次握手&#xff0c;客户端收到服务器的SYNACK包后&#xff0c;回复一个ACK包…...

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

.Net框架,除了EF还有很多很多......

文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容

基于 ​UniApp + WebSocket​实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配​微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility

Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

Leetcode33( 搜索旋转排序数组)

题目表述 整数数组 nums 按升序排列&#xff0c;数组中的值 互不相同 。 在传递给函数之前&#xff0c;nums 在预先未知的某个下标 k&#xff08;0 < k < nums.length&#xff09;上进行了 旋转&#xff0c;使数组变为 [nums[k], nums[k1], …, nums[n-1], nums[0], nu…...

比特币:固若金汤的数字堡垒与它的四道防线

第一道防线&#xff1a;机密信函——无法破解的哈希加密 将每一笔比特币交易比作一封在堡垒内部传递的机密信函。 解释“哈希”&#xff08;Hashing&#xff09;就是一种军事级的加密术&#xff08;SHA-256&#xff09;&#xff0c;能将信函内容&#xff08;交易细节&#xf…...