C++ STL精通之旅:向量、集合与映射等容器详解

目录

常用容器

顺序容器

向量vector

构造

尾接 & 尾删

中括号运算符

获取长度

清空

判空

改变长度

提前分配好空间

代码演示

运行结果

关联容器

集合set

构造

遍历

其他

代码演示

运行结果​编辑

映射map

常用方法

构造

遍历

其他

代码演示1​编辑

运行结果1

代码演示2

运行结果2

 string map 

代码演示3

运行结果3

 mp没赋初值,默认为0

代码演示4

运行结果4

容器适配器

栈stack

常用方法

代码演示1

运行结果1

vector也可以当栈来用

代码演示2

运行结果2

队列queue

常用方法

代码演示

运行结果

优先队列priority_queue

常用方法

构造

其他

大顶堆

代码演示1

运行结果1

 小顶堆

代码演示2

运行结果2

修改堆顶元素

代码演示3 

运行结果3

字符串

string (basic_string)

常用方法

构造

输入输出

其他

数值与字符串互转(C++11)

尾接字符串一定要用 +=

代码演示​

运行结果

对与元组

二元组pair

常用方法

构造

赋值

取值

判同

​适用场景

代码演示

运行结果


STL

STL 作为一个封装良好,性能合格的 C++ 标准库,在算法竞赛中运用极其常见。灵活且正确使用 STL 可以节省非常多解题时间,这一点不仅是由于可以直接调用,还是因为它封装良好,可以让代码的可读性变高,解题思路更清晰,调试过程往往更顺利。

不过 STL 毕竟使用了很多复杂的结构来实现丰富的功能,它的效率往往是比不上自己手搓针对特定题目的数据结构与算法的。因此,STL 的使用相当于使用更长的运行时间换取更高的编程效率。因此,在实际比赛中要权衡 STL 的利弊,不过这一点就得靠经验了。

接下来,博主会分享在算法竞赛中常用的 STL 容器,对于算法,函数和迭代器,就不着重展开讲了。

C++ 标准模板库 (STL, Standard Template Library):包含一些常用数据结构与算法的模板的 C++ 软件库。其包含四个组件——算法 (Algorithms)、容器 (Containers)、仿函数 (Functors)、迭代器 (Iterators).

示例:

  • 算法(Algorithms):STL中的算法是一组对容器进行操作的函数,它们独立于任何特定的数据结构,可以用于执行各种任务,如搜索、排序、复制和修改容器中的元素。这些算法是泛型的,意味着它们可以用于不同类型和容器的数据,体现了泛型编程的思想。

  • 容器(Containers):容器是用来存储数据的对象,例如数组、队列、链表、集合等。STL提供了多种容器类型,每种都设计用于特定类型的数据访问和存储。容器管理对象的集合,并提供插入、删除和遍历元素等操作。

  • 仿函数(Functors):仿函数是重载了操作符()的类或类对象,它可以像函数一样被调用。在STL中,仿函数通常用作算法的参数,允许用户自定义算法的行为,使得算法更加灵活和可配置。

  • 迭代器(Iterators):迭代器是一种类似于指针的对象,用于在容器中遍历元素。每个容器都定义了相应的迭代器类型,迭代器提供了读取和修改容器元素的方法。迭代器分为输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器,不同类型的迭代器支持不同的操作。

常用容器

顺序容器

  • 向量vector

头文件:#include <vector>

连续的顺序的储存结构(和数组一样的类别),但是有长度可变的特性。

构造

vector<类型> arr(长度, [初值])

时间复杂度:O(n)

尾接 & 尾删
  • push_back(元素):在 vector 尾接一个元素,数组长度 +1.

  • pop_back():删除 vector 尾部的一个元素,数组长度 -1.

时间复杂度:均摊 O(1)

中括号运算符

和一般数组一样的作用

时间复杂度:O(1)

获取长度

.size()

获取当前 vector 的长度

时间复杂度:O(1)

清空

.clear()

清空 vector

时间复杂度:O(n)

判空

.empty()

如果是空返回 true 反之返回 false.

时间复杂度:O(1)

改变长度

.resize(新长度, [默认值])

修改 vector 的长度

  • 如果是缩短,则删除多余的值

  • 如果是扩大,且指定了默认值,则新元素均为默认值(旧元素不变)

时间复杂度:O(n)

提前分配好空间

代码演示

运行结果

关联容器

  • 集合set

头文件#include <set>

提供对数时间的插入、删除、查找的集合数据结构。底层原理是红黑树。

集合三要素解释setmultisetunordered_set
确定性一个元素要么在集合中,要么不在
互异性一个元素仅可以在集合中出现一次❌(任意次)
无序性集合中的元素是没有顺序的❌(从小到大)❌(从小到大)
构造

set<类型, 比较器> st

  • 类型:要储存的数据类型

  • 比较器:比较大小使用的比较器,默认为 less<类型>,可自定义

对于需要自定义比较器的情况,涉及一些初学时容易看迷糊的语法(重载小括号运算符 / lambda 表达式),在此就不展开讲了。

遍历

其他
作用用法示例
插入元素.insert(元素)st.insert(1);
删除元素.erase(元素)st.erase(2);
查找元素.find(元素)auto it = st.find(1);
判断元素是否存在.count(元素)st.count(3);
查看大小 / 清空 / 判空

增删查时间复杂度均为 O(\log n)

代码演示

 运行结果

  • 映射map

头文件#include <map>

提供对数时间的有序键值对结构。底层原理是红黑树。

映射:                                        

                                                                ​   \begin{matrix} 1&\to&2\\ 2&\to&2\\ 3&\to&1\\ 4&\to&5\\ &\vdots \end{matrix}

性质解释mapmultimapunordered_map
互异性一个键仅可以在映射中出现一次❌(任意次)
无序性键是没有顺序的❌(从小到大)❌(从小到大)
常用方法
构造

map<键类型, 值类型, 比较器> mp

  • 键类型:要储存键的数据类型

  • 值类型:要储存值的数据类型

  • 比较器:键比较大小使用的比较器,默认为 less<类型>,可自定义

 
遍历

其他
作用用法示例
增 / 改 / 查元素中括号mp[1] = 2;
查元素(返回迭代器).find(元素)auto it = mp.find(1);
删除元素.erase(元素)mp.erase(2);
判断元素是否存在.count(元素)mp.count(3);
查看大小 / 清空 / 判空

增删改查时间复杂度均为 O(\log n)

代码演示1
 运行结果1

 代码演示2

 

  运行结果2

 string map 
代码演示3

 运行结果3

 mp没赋初值,默认为0
代码演示4

 运行结果4

容器适配器

  • 栈stack

头文件#include <stack>

通过二次封装双端队列 (deque) 容器,实现先进后出的栈数据结构。

常用方法
作用用法示例
构造stack<类型> stkstack<int> stk;
进栈.push(元素)stk.push(1);
出栈.pop()stk.pop();
取栈顶.top()int a = stk.top();
查看大小 / 清空 / 判空
代码演示1

运行结果1

vector也可以当栈来用
代码演示2

运行结果2

  • 队列queue

头文件#include <queue>

通过二次封装双端队列 (deque) 容器,实现先进先出的队列数据结构。

常用方法
作用用法示例
构造queue<类型> quequeue<int> que;
进队.push(元素)que.push(1);
出队.pop()que.pop();
取队首.front()int a = que.front();
取队尾.back()int a = que.back();
查看大小 / 清空 / 判空
代码演示

运行结果

  • 优先队列priority_queue

头文件#include <queue>

提供常数时间的最大元素查找,对数时间的插入与提取,底层原理是二叉堆。

常用方法
构造

priority_queue<类型, 容器, 比较器> pque

  • 类型:要储存的数据类型

  • 容器:储存数据的底层容器,默认为 vector<类型>,竞赛中保持默认即可

  • 比较器:比较大小使用的比较器,默认为 less<类型>,可自定义

priority_queue<int> pque1;                            // 储存int的大顶堆
priority_queue<int, vector<int>, greater<int>> pque2; // 储存int的小顶堆
其他
作用用法示例
进堆.push(元素)que.push(1);
出堆.pop()que.pop();
取堆顶.top()int a = que.top();
查看大小 / 判空

进出队复杂度 O(\log n),取堆顶 $O(1).

大顶堆
代码演示1

 运行结果1

 小顶堆
代码演示2

运行结果2

修改堆顶元素
代码演示3 

运行结果3

字符串

  • string (basic_string<char>)

头文件#include <string>

顾名思义,就是储存字符串的。

常用方法
构造

输入输出

C++

 

C

 
其他
作用用法示例
修改、查询指定下标字符[]s[1] = 'a';
是否相同==if (s1 == s2) ...
字符串连接+string s = s1 + s2;
尾接字符串+=s += "awa";
取子串.substr(起始下标, 子串长度)string sub = s.substr(2, 10);
查找字符串.find(字符串, 起始下标)int pos = s.find("awa");
数值与字符串互转(C++11)
目的函数
int / long long / float / double / long doublestringto_string()
stringintstoi()
stringlong longstoll()
stringfloatstof()
stringdoublestod()
stringlong doublestold()
尾接字符串一定要用 +=

 代码演示

 运行结果

对与元组

  • 二元组pair

头文件#include <utility>

顾名思义,就是储存二元组的。

常用方法
构造

pair<第一个值类型, 第二个值类型> pr

  • 第一个值类型:要储存的第一个值的数据类型

  • 第二个值类型:要储存的第二个值的数据类型

 
赋值

老式

 

列表构造 C++11

取值

直接取值

  • 取第一个值:.first

  • 取第二个值:.second

 

结构化绑定 C++17

判同

直接用 == 运算符


适用场景

所有需要二元组的场景均可使用,效率和自己定义结构体差不多。

代码演示

 运行结果

 

希望对你有帮助!加油!

若您认为本文内容有益,请不吝赐予赞同并订阅,以便持续接收有价值的信息。衷心感谢您的关注和支持!

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安卓9宫格密码键盘

自定义组件 package com.zx.mocab.views;import android.content.Context; import android.graphics.Canvas; import android.graphics.Paint; import android.graphics.Path; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent…

adb push 将电脑中的文件传输到安卓开发板

1. adb remount 重新挂载设备的文件系统&#xff0c;以便可以对设备进行读写操作&#xff0c;通常情况下&#xff0c;安卓开发板在连接到计算机后&#xff0c;设备的文件系统会被挂载为只读文件系统&#xff0c;重新挂载后变成可读可写权限 C:\Users\Administrator>adb re…

工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势

工业笔记本是专为在恶劣环境条件下工作而设计的高度耐用的计算机设备。与传统消费者级笔记本电脑相比&#xff0c;工业笔记本在极端温度下展现出了许多优势。本文将探讨工业笔记本在极端温度环境中的表现&#xff0c;并介绍其优势。 耐高温性能: 工业笔记本具有更高的耐高温性…

2月6日作业

1.现有无序序列数组为23,24,12,5,33,5347&#xff0c;请使用以下排序实现编程 函数1:请使用冒泡排序实现升序排序 函数2:请使用简单选择排序实现升序排序 函数3:请使用快速排序实现升序排序 函数4:请使用插入排序实现升序排序 #include<stdio.h> #include<string.h&…

2024-01-06-AI 大模型全栈工程师 - 机器学习基础

摘要 2024-01-06 阴 杭州 晴 本节简介: a. 数学模型&算法名词相关概念; b. 学会数学建模相关知识&#xff1b; c. 学会自我思考&#xff0c;提升认知&#xff0c;不要只会模仿&#xff1b; 课程内容 1. Fine-Tuning 有什么作用&#xff1f; a. 什么是模型训练&#xff…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

掌握Pandas数据转换利器深入解析pd.to_numeric函数与实战技巧【第63篇—python:Pandas数据】

文章目录 引言pd.to_numeric函数简介参数详解实战案例进阶应用&#xff1a;处理缺失值与异常值1. 处理缺失值2. 处理异常值 高效利用downcast参数优化内存占用优化性能&#xff1a;使用apply函数批量处理数据实战案例&#xff1a;处理时间序列数据处理多列数据&#xff1a;结合…

知识管理平台有哪些?帮助企业高效发展

在现代商业环境中&#xff0c;知识被认为是推动企业高效发展的关键因素。一个有效的知识管理平台可以帮助企业收集、整理和分享知识&#xff0c;从而提高工作效率&#xff0c;增强竞争优势。接下来&#xff0c;我将向大家推荐三款优秀的知识管理平台&#xff1a;Helplook&#…

Python初学者学习记录——python基础综合案例:数据可视化——动态柱状图

一、案例效果 通过pyecharts可以实现数据的动态显示&#xff0c;直观的感受1960~2019年世界各国GDP的变化趋势 二、通过Bar构建基础柱状图 反转x轴和y轴 标签数值在右侧 from pyecharts.charts import Bar from pyecharts.options import LabelOpts# 构建柱状图对象 bar Bar()…

理解“无意义的”JavaScript特性

概要 JavaScript可能是世界上最流行的客户端语言&#xff0c;但它远非完美&#xff0c;也不是没有怪癖。Juan Diego Rodriguez研究了几个“荒谬的”JavaScript怪癖&#xff0c;并解释了它们是如何进入语言的&#xff0c;以及如何在自己的代码中避免它们。 特性 为什么JavaS…

【并发编程】手写线程池阻塞队列

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;并发编程 ⛺️稳重求进&#xff0c;晒太阳 示意图 步骤1&#xff1a;自定义任务队列 变量定义 用Deque双端队列来承接任务用ReentrantLock 来做锁并声明两个条件变量 Condition fullWai…

PDF文件格式(一):交叉引用流

在PDF-1.5版本之前&#xff0c;对象的交叉引用信息是存储在交叉引用表(cross-reference table)中的。在PDF-1.5版本之后&#xff0c;引进了交叉引用流(cross-reference stream)对象&#xff0c;可以用它来存储对象的交叉引用信息&#xff0c;就像交叉引用表的功能一样。 采用交…

鸿蒙开发系列教程(十一)--布局应用:层叠布局

层叠布局 &#xff08;Stack&#xff09; 层叠布局&#xff08;StackLayout&#xff09;用于在屏幕上预留一块区域来显示组件中的元素&#xff0c;提供元素可以重叠的布局。层叠布局通过stack容器组件实现位置的固定定位与层叠&#xff0c;容器中的子元素&#xff08;子组件&…

Python进阶----在线翻译器(Python3的百度翻译爬虫)

目录 一、此处需要安装第三方库requests: 二、抓包分析及编写Python代码 1、打开百度翻译的官网进行抓包分析。 2、编写请求模块 3、输出我们想要的消息 三、所有代码如下&#xff1a; 一、此处需要安装第三方库requests: 在Pycharm平台终端或者命令提示符窗口中输入以下代…

JVM-JVM内存结构(二)

堆 堆(Heap) 通过new关键字&#xff0c;创建的对象都会使用堆内存特点&#xff1a; 他是线程共享的&#xff0c;堆中的对象需要考虑线程安全的问题有垃圾回收机制 堆内存溢出(OutOfMemoryError) 代码演示 List<String> list new ArrayList<>(); try{String …

【已解决】pt文件转onnx后再转rknn时得到推理图片出现大量锚框变花屏

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.RKNN版本 py3.8-rknn2-1.4.0 3.单板 迅为itop-3568开发板 一、现象 采用yolov5训练并将pt转换为onnx&#xff0c;再将onnx采用py3.8-rknn2-1.4.0推理转换为rknn&#xff0c;rknn模型能正常转换&#xff0c;…

阿里地址标准化相关能力

阿里云地址标准化服务入口 1地址标准化概念 阿地址标准化&#xff08;Address Purification&#xff09;是一站式闭环地址数据处理和服务平台产品&#xff0c;依托阿里云海量的地址语料库&#xff0c;针对各行业业务系统所登记的地址数据&#xff0c;进行纠错、补全、归一、结…

【QT】opcuaServer 的构建

【QT】opcuaServer 的构建 前言opcuaServer实现测试 前言 在博文【opcua】从编译文件到客户端的收发、断连、节点查询等实现 中&#xff0c;我们已经介绍了如何在QT 中创建opucaClient 。在本期的博文中&#xff0c;我们基于之前的部署环境&#xff0c;介绍一下如何构建opcuaS…

Windows 离线安装MySQL8教程

本文描述了在Windows 11 上离线安装MySQL8的方法本方法同样使用与Win10、Windows Server等本文仅供参考&#xff0c;请理解后安装和优化 一、下载文件 官方下载路径 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.36-winx64.zip百度网盘缓存 微信小程序搜索“数字…

arcgis各种版本下载

arcgic 下载&#xff01;&#xff01;&#xff01; ArcGIS是一款地理信息系统软件&#xff0c;由美国Esri公司开发。它提供了一系列完整的GIS功能&#xff0c;包括地图制作、空间数据管理、空间分析、空间信息整合、发布与共享等。ArcGIS是一个可扩展的GIS平台&#xff0c;提供…