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

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());						//删除第一个

相关文章:

STL用法总结

文章目录 vector构造常用函数遍历适用情形注意事项使用迭代器删除可能会出现的错误 Set & MultiSet&#xff08;不能用sort,会自动排序&#xff09;构造常用函数删除&#xff0c;查找遍历 unordered_set(不排序集合&#xff09;&#xff0c;unordered_multiset Map & M…...

他人项目二次开发——慎接

接了一个朋友的项目——开发及运营迭代差不多2年多了&#xff0c;整体样子移动端和PC都能正常使用&#xff0c;但后期的扩展性及新功能添加出现瓶颈。 因此给了一部分钱&#xff0c;让我接手来开发——重构架构。 背景说明 朋友公司的技术人员是我帮忙招聘的&#xff0c;相关技…...

k8s之PV、PVC

文章目录 k8s之PV、PVC一、存储卷1、存储卷定义2、存储卷的作用2.1 数据持久化2.2 数据共享2.3 解耦2.4 灵活性 3、存储卷的分类3.1 emptyDir存储卷3.1.1 定义3.1.2 特点3.1.3 用途3.1.4 示例 3.2 hostPath存储卷3.2.1 定义3.2.2 特点3.2.3 用途3.2.4 示例 3.3 NFS存储卷3.3.1 …...

新人学习笔记之(JavaScript作用域)

一、作用域 1.通常来说&#xff0c;一段程序代码中所用的名字并不总是有效和可用的&#xff0c;而限定这个名字的可用性的代码范围就是这个名字的作用域。作用域的使用提高了程序逻辑的局部性&#xff0c;增强了程序的可靠性&#xff0c;减少了名字冲突 二、变量的作用域 1.变…...

图论第一天

在单位摸鱼&#xff0c;地铁上看了个开始&#xff0c;图论开了个头&#xff0c;后面也希望能往这个方向上转&#xff0c;努努力吧。 一周没做题啦&#xff0c;后面坚持继续做题&#xff0b;二刷&#xff0c;接着记录每一天&#xff01;&#xff01;&#xff01;加油&#xff0…...

革新风暴来袭:报事报修系统小程序如何重塑报事报修体验?

随着数字化、智能化的发展&#xff0c;已经应用在我们日常生活和工作的方方面面。那么&#xff0c;你还在为物业报修而头疼吗&#xff1f;想象一下&#xff0c;家里的水管突然爆裂&#xff0c;你急忙联系物业&#xff0c;时常面临物业电话忙音、接听后才进行登记繁琐的报修单、…...

linux各个日志的含义 以及使用方法

在Linux系统上&#xff0c;系统日志文件通常存储在/var/log/目录下。可以通过查看这些日志文件来了解系统的操作记录、错误信息和其他相关信息。以下是一些常见的系统日志文件以及它们包含的信息&#xff1a; /var/log/messages&#xff1a;这是一个常见的系统日志文件&#xf…...

详解 Spark 核心编程之 RDD 持久化

一、问题引出 /** 案例&#xff1a;对同一份数据文件分别做 WordCount 聚合操作和 Word 分组操作 期望&#xff1a;针对数据文件只进行一次分词、转换操作得到 RDD 对象&#xff0c;然后再对该对象分别进行聚合和分组&#xff0c;实现数据重用 */ object TestRDDPersist {def …...

创新融合,5G+工业操作系统引领未来工厂

为加速企业完成生产制造自动化和经营管理自动化&#xff0c;从而走向未来工厂&#xff0c;蓝卓不断探索supOS工业操作系统与前沿技术的的创新融合&#xff0c;而5G技术为工业操作系统提供了更多元化的赋能手段和想象空间。目前&#xff0c;supOS围绕生产、安全、质检、监控等领…...

自监督表示学习和神经音频合成实现语音修复

关键词&#xff1a;语音修复、自监督模型、语音合成、语音增强、神经声码器 语音和/或音频修复的目标是增强局部受损的语音和/或音频信号。早期的工作基于信号处理技术&#xff0c;例如线性预测编码、正弦波建模或图模型。最近&#xff0c;语音/音频修复开始使用深度神经网络&a…...

【论文复现|智能算法改进】融合黑寡妇思想的蜣螂优化算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】蜣螂优化算法&#xff08;DBO&#xff09;原理及实现 2.改进点 ICMIC混沌映射 z n 1 sin ⁡ ( α z n ) , α ∈ ( 0 , ∞ ) (1) z_{n1}\sin(\frac{\alpha}{z_n}),\alpha\in(0,\infty)\ta…...

Unity + 雷达 粒子互动(待更新)

效果预览: 花海(带移动方向) VFX 实例 脚本示例 使用TouchScript,计算玩家是否移动,且计算移动方向 using System.Collections; using System.Collections.Generic; using TouchScript; using TouchScript.Pointers; using UnityEngine; using UnityEngine.VFX;public …...

英语翻译程序,可以对用户自己建立的词汇表进行增删查改

⑴ 自行建立一个包含若干英文单词的词汇表文件&#xff0c;系统初始化时导入内存&#xff0c;用于进行句子翻译。 ⑵ 用户可以输入单词或者句子&#xff0c;在屏幕上显示对应翻译结果。 ⑶ 用户可对词汇表进行添加和删除&#xff0c;并能将更新的词汇表存储到文件中。 #defi…...

Django ORM魔法:用Python代码召唤数据库之灵!

探索Django ORM的神奇世界&#xff0c;学习如何用Python代码代替复杂的SQL语句&#xff0c;召唤数据库之灵&#xff0c;让数据管理变得轻松又有趣。从基础概念到高级技巧&#xff0c;阿佑带你一步步成为Django ORM的魔法师&#xff0c;让你的应用开发速度飞起来&#xff01; 文…...

JetBrains Mono字体下载及安装

百度云字体下载 提取码&#xff1a;zida 1.mac 安装 选择文件夹中的所有字体文件&#xff0c;然后双击它们。点击“安装字体”按钮。 2.windows 安装 选择文件夹中的字体文件&#xff0c;右键单击其中任何一个&#xff0c;然后从菜单中选择“安装”。 3.linux 安装 将字体…...

【OS】AUTOSAR OS系统调用产生Trap的过程详解

目录 前言 正文 1.Os_Hal_Trap使用示例 2. Os_Hal_Trap的定义 3. syscall详解详解...

Java中的异常处理机制

在Java中&#xff0c;异常处理是一种重要的编程机制&#xff0c;用于处理程序运行时可能出现的错误情况。它提供了一种结构化的方式来处理异常情况&#xff0c;使程序能够更健壮、更易于维护。下面将从技术难点、面试官关注点、回答吸引力和代码举例四个方面来详细描述Java中的…...

什么是PLAB?

接上文PLAB---》 可以看到和TLAB很像&#xff0c;PLAB即 Promotion Local Allocation Buffers。用在年轻代对象晋升到老年代时。 在多线程并行执行YGC时&#xff0c;可能有很多对象需要晋升到老年代&#xff0c;此时老年代的指针就"热"起来了&#xff0c;于是搞了个…...

复试不考机试,初试300分以上,上岸稳了?东北林业大学计算机考研考情分析!

东北林业大学&#xff08;Northeast Forestry University&#xff09;&#xff0c;简称东北林大&#xff08;NEFU&#xff09;&#xff0c;位于黑龙江省哈尔滨市&#xff0c;是一所以林科为优势、林业工程为特色的中华人民共和国教育部直属高校&#xff0c;由教育部、国家林业局…...

【30天精通Prometheus:一站式监控实战指南】第12天:windows_exporter从入门到实战:安装、配置详解与生产环境搭建指南,超详细

亲爱的读者们&#x1f44b;   欢迎加入【30天精通Prometheus】专栏&#xff01;&#x1f4da; 在这里&#xff0c;我们将探索Prometheus的强大功能&#xff0c;并将其应用于实际监控中。这个专栏都将为你提供宝贵的实战经验。&#x1f680;   Prometheus是云原生和DevOps的…...

Python爬虫实战:研究MechanicalSoup库相关技术

一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会&#xff0c;其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具&#xff0c;对过去十年 WWDC 主题演讲内容进行了系统化分析&#xff0c;形成了这份…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

练习(含atoi的模拟实现,自定义类型等练习)

一、结构体大小的计算及位段 &#xff08;结构体大小计算及位段 详解请看&#xff1a;自定义类型&#xff1a;结构体进阶-CSDN博客&#xff09; 1.在32位系统环境&#xff0c;编译选项为4字节对齐&#xff0c;那么sizeof(A)和sizeof(B)是多少&#xff1f; #pragma pack(4)st…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...