STL用法总结

文章目录

  • vector
      • 构造
      • 常用函数
      • 遍历
      • 适用情形
      • 注意事项
        • 使用迭代器删除可能会出现的错误
  • Set & MultiSet(不能用sort,会自动排序)
      • 构造
      • 常用函数
        • 删除,查找
        • 遍历
      • unordered_set(不排序集合),unordered_multiset
  • Map & MultiMap
        • 区别
      • 常见用法
      • 注意事项
  • stack
      • 成员函数
      • 注意事项
  • queue(队列)
      • priority_queue(优先队列)
  • deque(双端队列)
      • 常用函数

vector

构造

vector<int> a;
vector<int> a(100) ;//初始长为100
vector<int> a(100,1);//长度为100,赋初值为1
vector<vector<int> > a(100,vector<int>());
vector<vector<int> > a(100,vector<int> (100,-1);
vector<int> a[100] {{100,1}}//括号里有省略,这是类似数组的构造

常用函数

     v1.resize(10,5);//改变大小,赋初值5,默认零v1[2]=6;//先resize,才能用,/vector里有值/初始长度v1.push_back(7);//在后面添加v1.pop_back();//删除最后一位v1.front()//返回第一个if(v1==v2) //比较if(!v1.empty())//不为空int n=v1.size();//大小v1.insert(v1.begin()+1,2);//插入v1.erase(v1.begin()+1);//删除第二个v1.erase(v1.begin()+2,v1.begin()+5);//删除第3到5的三个元素v1.clear();//清空所有swap(v1,v2);//交换vectorsort(v1.begin(),v1.end());//sort排序v1.erase(unique(v1.begin(),v1.end()),v1.end());//对有序序列去重

遍历

     for(auto it:v1)//加强for遍历cout<<it;for(auto it=v1.begin();it<v1.end();it++)//迭代器遍历cout<<*it;for(int i=0;i<3;i++)//下标遍历cout<<v1[i];

适用情形

1.一般情况下,可以代替数组,除非该题卡常
2.n x m矩阵,比较大时,数组浪费内存,会MLE。用vector可以。另外它的数据存在堆空间,不会爆栈。

注意事项

1.最好提前指定长度。不停push_back,会慢
2.size()返回类型为size_t,一般[0,2^32)
3.能直接比较: ==, !=, <=, >=, <, 和 >.
4.end()前一位 是尾值
5. rbegin(),rend(),是逆迭代器

使用迭代器删除可能会出现的错误
vector<int > a{1,2,3,4};
for(auto it=a.begin();it!=end();it++)
if(*it==2||*it==3)
a.erase(*it);
//遍历结果是{1,3,4};
//3不会删除
vector<int > a{1,2,3,4};
for(auto it=a.begin();it!=end();it++)
if(*it==4)
a.erase(it);
//会出现re

可以思考一下,这两种错误

Set & MultiSet(不能用sort,会自动排序)

多元集合(MultiSets)和集合(Sets)相像,只不过支持重复对象,其用法与set基本相同。
set 其中所包含的元素的值是唯一的,且是按一定顺序排列的,因为其内部是通过链表的方式来组织,所以在插入的时候比vector 快,但在查找和末尾添加上比vector 慢

构造

     set<int> s1;                       set<int> s2{1,2,3};                // 定义 s2,初始值为 {1,2,3}set<int> s3(s2);                   // 使用 s2 初始化 s3set<int> s4(s2.begin(), s2.end()); // 使用迭代器初始化 s4set<int,greater<int> > s5;        //从大到小

常用函数

删除,查找
	  s5.erase(10);//删除所有元素10set<int>::iterator iter2 = s5.begin(), iter1;   // 迭代器删除iter1 = iter2;iter2++;  //不能iter+=2s5.erase(iter1, iter2); // 删除 [iter1, iter2) 区间的元素auto m=s5.find(4);//查找,删除s5.erase(m);	
  		 s2.clear();// 清空容器元素s.lower_bound(key);		//返回指向第一个不小于给定键值key的元素的迭代器。s.upper_bound(key);		//返回指向第一个大于给定键值key的元素的迭代器。auto n=s5.lower_bound(15);  //例子if(n==s5.end())     cout<<"****";
遍历

用迭代器
for(set::iterator it=st.begin();it!=st.end();++i)
cout<<*it<<endl;
强化for
for(auto it:st)//不确定
cout<<it<<endl;

unordered_set(不排序集合),unordered_multiset

unordered_set是一个集合容器,它存储唯一的元素,并且元素是无序的。 与set相比,unordered_set的插入、删除和查找操作都更快 。插入,是插前面,不能用lower_bound。不能用sort.

Map & MultiMap

区别
  1. 实现不同
    ●unordered_ map底层是用哈希表实现的
    ●map底层是用红黑树实现的
    ●unordered_ map是不按键值排序的,插入的时间是O(logn),查询时间是0(1)
    ●map是按键值排序的,插入的时间是O(logn),查询时间是O(logn)

  2. 使用范围不同
    ●unordered_ map的使用比较局限,它的key只能是int、double等基本类型以及string,而不能是自己定义的结构体
    ●map可以支持所有类型的键值对

常见用法

//声明map<int,int> m1;map<int,int,greater<int> > m2;//从大到小排unordered_map<int,int> m3;//插入m2.insert({2,7});//和上边循环重合就没效果了//删除m2.erase(3);//删除键3auto it=m2.begin();//删除从[it,m2.end)it++;m2.erase(it,m2.end());m2.clear();    //清空//查找auto n=m2.find(3);if(n==m2.end())cout<<"****";//遍历,要加first,secondif(!m2.empty())for(auto it:m2)cout<<it.first;//数量int m=m2.count(4); cout<<m ;//sizeint k=m2.size();

注意事项

不能用迭代器计算下标
访问遍历用迭代器,操作别用
去重函数unique和string能不能用

stack

stack是一种先进后出(LIFO)的数据结构,只能从栈顶进行插入和删除操作,不支持在其他位置访问或修改元素,sort排序。

成员函数

stack<int> a;
a.push(元素);
a.pop();
a.top();
a.size();
a.empty();

注意事项

1.不可以下标索引
2.只读
3.不可用迭代器计算下标

queue(队列)

queue队列经常在图的广度优先搜索bfs和最短路算法spfa中应用。

queue中的常用函数

queue<int> q;							//
queue<pair<int,int> I> qq;					//声明一个pair类型的队列容器
q.push(5);							//将5插入队尾  
q.pop();								//将队头元素删除  
int x = q.front();						//返回队头元素 
int y = q.back();						//返回队尾元素  

priority_queue(优先队列)

priority_queue<int> q;				//声明大顶堆
priority_queue<int,vector<int>,greater<int> > p;	//声明一个二元组类型的队列q.push(111);						//将元素插入队列中 O(log n)
q.pop();							//删除队头元素, O(log n)
int f = q.top();                  //返回队列中最大元素,O(1)
int k=p.top();					 //返回队列中最小元素,O(1)

priority_queue不支持删除堆中任意元素。

deque(双端队列)

双端队列deque是一个支持在两端高效插入或删除元素的连续线性储存空间。它像是vector和queue的结合。与vector相比,deque在头部增删元素仅需要O(1)的时间;与queue相比,deque像数组一样支持随机访问。可以sort排序。

常用函数

deque<int> q;							//声明一个int型的deque容器
int y = q.front(), z = q.back();		//返回队头/尾元素
q.push_back(5);							//从队尾入队
q.push_front(7);						//从队头入队
q.pop_front();							//删除队头元素
q.pop_back();							//删除队尾元素
q.clear();								//清空容器 
q.erase(q.begin());						//删除第一个

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

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

相关文章

spring boot 3.x版本 引入 swagger2启动时报错

一&#xff0c;问题 Spring Boot 3.x版本的项目里&#xff0c;准备引入Swagger2作为接口文档&#xff0c;但是项目启动报错&#xff1a; java.lang.TypeNotPresentException: Type javax.servlet.http.HttpServletRequest not present at java.base/sun.reflect.generics.…

儿童节礼物-你能满足孩子们吗

题目如下&#xff1a; 儿童节到了&#xff0c;幼儿园里有N个小朋友&#xff0c;每个小朋友都希望得到一份礼物。幼儿园的老师准备了M份不同的礼物&#xff0c;每份礼物都有一个编号&#xff0c;从1到M。老师希望每个小朋友都能得到一份礼物&#xff0c;但是每个小朋友对礼物的…

Nginx(openresty) 开启gzip压缩功能 提高web网站传输速度

1 开启nginx gzip压缩后&#xff0c;网页的图片&#xff0c;css、js等静态资源的大小会减少&#xff0c;节约带宽&#xff0c;提高传输效率&#xff0c;给用户快的体验,给用户更好的体验. 2 安装 #centos 8.5 yum install gzip 3 配置 #建议统一配置在http段 vim /usr/loca…

Python语言云:探索Python在云计算领域的无限可能

Python语言云&#xff1a;探索Python在云计算领域的无限可能 随着云计算技术的迅猛发展&#xff0c;Python作为一种强大且易用的编程语言&#xff0c;在云计算领域展现出了其独特的魅力和无限可能。本文将从四个方面、五个方面、六个方面和七个方面&#xff0c;深入剖析Python…

SleepFM:利用对比学习预训练的多模态“睡眠”基础模型

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在阅读过程中有些知识点存在盲区&#xff0c;可以回到如何优雅的谈论大模型重新阅读。另外斯坦福2024人工智能报告解读为通识性读物。若对于如果…

kaggle竞赛实战5

接下来将两套方案得结果做数据拼接 读数据 train_dict pd.read_csv(\ preprocess/train_dict.csv\ ) test_dict pd.read_csv(\ preprocess/test_dict.csv\ ) train_groupby pd.read_csv(\ preprocess/train_groupby.csv\ ) test_groupby pd.read_csv(\ …

逻辑这回事(三)----功耗优化

低功耗设计概述 低功耗设计动机 功耗的增加影响芯片Power grid(电源网格)的设计;功耗的增加导致芯片温度的上升,进而带来一系列影响。如Leakage Power增加;电路时序可能变差;IR Drop(IR压降)变大;功耗的增加导致芯片封装成本和散热成本的增加(packing cost、cooling cost)功耗…

window本地域名映射修改

位置 C:\Windows\System32\drivers\etc 文件名 hosts 修改方法 复制一份到桌面 修改桌面的文件 # 前面为ip 后面为域名&#xff0c;域名-》ip的映射 127.0.0.1 link.com最后将修改后的文件保存&#xff0c;复制到C:\Windows\System32\drivers\etc替换

Mysql 8.0.37 安装教程

图片有点长&#xff0c;慢慢来 安装教程 安装地址&#xff1a;MySQL :: MySQL Downloads 进入官网 下载社区版 此处有两个版本&#xff0c;我们下载的是8.0.37版本 第一个需要联网安装&#xff0c;我们现在第二个离线安装 server only&#xff1a;仅安装MySQL server clien…

Java18+前端html+后端springboot一套可在线预约、在线下单的家政预约上门服务系统源码 家政系统(用户端)介绍

Java18前端html后端springboot一套可在线预约、在线下单的家政预约上门服务系统源码 家政系统&#xff08;用户端&#xff09;介绍 家政服务用户端是一个为家庭用户提供便捷、高效家政服务的应用程序。 以下是家政服务用户端的详细功能描述&#xff1a; 一、注册与登录&#…

day46 完全背包理论基础 518. 零钱兑换 II 377. 组合总和 Ⅳ

完全背包理论基础 有N件物品和一个最多能背重量为W的背包。第i件物品的重量是weight[i]&#xff0c;得到的价值是value[i] 。每件物品都有无限个&#xff08;也就是可以放入背包多次&#xff09;&#xff0c;求解将哪些物品装入背包里物品价值总和最大。 01背包内嵌的循环是从…

BearPi-HM Nano开发笔记

小熊派 简单介绍 BearPi-HM Nano开发板是一块专门为鸿蒙OS设计的HarmonyOS开发板&#xff0c;板载高度集成的2.4GHz WLAN SoC芯片Hi3861&#xff0c;并板载NFC电路及标准的E53接口可拓展 E53接口 介绍 E53接口标准为“物联网俱乐部”联合国内多家开发板厂家制定的物联网案…

80个GitHub上c/c++学习项目推荐——拎几个出来写进简历

1.《30天自制C服务器》 ①语言&#xff1a;c ②来源&#xff1a;GitHub 目前star:4.8k ③项目地址&#xff1a;https://github.com/yuesong-feng/30dayMakeCppServer ④类型&#xff1a;免费 2.《btop》&#xff08;命令行资源监视器&#xff09; ①语言&#xff1a;c ②…

【六一儿童节】的科技奇幻旅程:解锁【机器学习】与【人工智能】的无限创意

目录 一、机器学习与人工智能简介 二、六一儿童节的特殊意义 三、项目概述&#xff1a;智能绘画助手 四、技术栈和工具 五、数据准备 六、模型训练 1. 数据预处理 2. 构建和训练模型 七、智能绘画助手的实现 1. 搭建Flask应用 2. 客户端界面 八、扩展功能与优化 1…

Flutter 中的 SliverToBoxAdapter 小部件:全面指南

Flutter 中的 SliverToBoxAdapter 小部件&#xff1a;全面指南 Flutter 是一个流行的 UI 框架&#xff0c;它提供了多种灵活的组件来构建丰富和交互式的用户界面。在 Flutter 的滚动和布局组件中&#xff0c;SliverToBoxAdapter 是一个特殊的小部件&#xff0c;它允许将 BoxWi…

Message的复用

前言 在Android开发中&#xff0c;Message作为Handler通信机制的核心组件之一&#xff0c;其创建方式的选择直接影响着应用的性能表现。传统的新建实例方式(new Message())虽然直观&#xff0c;但在频繁的消息传递场景下可能会引发大量的对象创建与销毁&#xff0c;进而增加垃…

图像交换部分区域或帧

生成一个boundingbox&#xff0c;或区间 给定矩形框占图像的面积比例&#xff0c;和图像的宽W高H&#xff0c;生成矩形框。根据给定的矩形框&#xff0c;交换两张图像的部分区域。 这里为了方便展示&#xff0c;简化问题&#xff0c;给定一个图像数组mels&#xff0c;对第 i …

【第2章】SpringBoot实战篇之接口参数校验和全局异常处理

文章目录 前言一、参数校验1. 引入库2. 全局异常处理3. 控制器类4. 响应 二、对象校验1.实体类2.控制器类3. 全局异常处理4. 响应 总结 前言 对接口请求参数校验是每一个开发人员都必须熟知且善用的功能&#xff0c;是保证程序健壮性的基石。 除引入方式不同&#xff0c;使用…

从零到一的程序猿-day2-yoloV4训练及免环境易语言调用

简介 本项目功能介绍&#xff1a;针对4位英文数字随机组合的验证码抽象图片进行分类识别&#xff0c;识别结果为验证码内容 训练 没有难度&#xff0c;手动标注&#xff0c;样本为150张&#xff0c;首先识别出图片中每个英数的位置&#xff0c;再由分类器进行标注识别&#x…

Github:ChatTTS从下载到使用

前言 本文使用工具&#xff1a; Anaconda &#xff1a;直接进行包管理&#xff0c;用来自定义生成python解释器&#xff0c;虚拟环境vscode&#xff1a;用来执行代码 注&#xff1a;我使用的Ubuntu&#xff0c;使用win&#xff0c;mac等&#xff0c;需要额外配置 简介 Chat…