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

news2024/9/22 5:06:59

目录

常用容器

顺序容器

向量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

判同

直接用 == 运算符


适用场景

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

代码演示

 运行结果

 

希望对你有帮助!加油!

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

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

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

相关文章

搜索与图论(一)(深搜,广搜,树与图的存储遍历,拓扑排序)

一、DFS 往深里搜&#xff0c;搜到叶子结点那里&#xff0c;回溯&#xff0c;到可以继续到叶子结点深搜的位置。 1、回溯一定要恢复现场 2、定义一个与当前递归层数有关的终止条件&#xff08;题目要求的东西&#xff09; 3、每层都用循环判断是否存在可以dfs的路 输出数字…

PbootCMS采集插件使用教程

这篇Pboot采集教程教你使用PbootCMS采集插件&#xff0c;自动批量采集网页文章数据&#xff0c;并发布到PbootCMS系统&#xff0c;快速丰富网站的内容。 1. 下载并安装PbootCMS采集插件 1-1&#xff09;PbootCMS采集插件免费下载&#xff1a;Pboot采集插件-PbootCMS发布模块下…

「Mybatis实战五」:Mybatis核心文件详解 - MyBatis常用配置environments、properties

一、MyBatis核心配置文件层级关系 ​ 本文代码在 Mybatis初体验&#xff1a;一小时从入门到运行你的第一个应用 所构建的基础代码结构之上&#xff0c;进行修改。 MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下&#xff1a; 二…

什么是大小端字节序存储?如何用代码判断当前的机器是大端字存储还是小端存储?

目录 什么是大端字节序存储与小端字节序存储 为什么会有大端和小端之分&#xff1f; 用代码判断当前机器是大端存储还是小端存储 什么是大端字节序存储与小端字节序存储 1.字节序&#xff1a;以字节为单位&#xff0c;讨论存储顺序 2.大端字节序存储&#xff1a;高位在低地…

C和C++面试--看的不多只看一篇

C和C面试 1. 语言基础1.1 C和C有什么区别&#xff1f;1.2 a和&a有什么区别&#xff1f;1.3 #define和const区别&#xff1f;&#xff08;编译阶段、安全性、内存占用等&#xff09;1.4 inline函数1.5 对于⼀个频繁使⽤的短⼩函数&#xff0c;应该使⽤什么来实现&#xff1f…

【C语言】三子棋游戏实现代码

目录 1.三子棋代码功能介绍 2.三子棋游戏实现步骤 ①打印菜单栏 ②判断是否进入三子棋游戏 ③三子棋游戏基本函数实现 &#xff08;1&#xff09;清空&#xff08;初始化&#xff09;棋盘函数实现 &#xff08;2&#xff09;打印棋盘函数实现 &#xff08;3&#xff0…

【HTML】MDN

文章目录 一、html元素1.1 <a>1.2 <abbr>1.3 <address>1.4<area>1.5 <article>1.6 <aside>1.7 <audio>1.8 <b>1.9 <base>1.10<bdi>1.11 <bdo>1.12 <blockquote>1.13 <body>1.14 <br>1.15…

计组学习笔记2024/2/4

1.计算机的发展历程 2.计算机硬件的基本组成 存储器 -> 就是内存. 3.各个硬件的部件 寄存器 -> 用来存放二进制数据. 各个硬件的工作原理视频留白,听完后边课程之后再来理解理解. 冯诺依曼计算机的特点: 1.计算机由五大部件组成 2.指令和数据以同等地位存于存储器,…

计算机视觉 | OpenCV 实现手势虚拟控制亮度和音量

Hi&#xff0c;大家好&#xff0c;我是半亩花海。在当今科技飞速发展的时代&#xff0c;我们身边充斥着各种智能设备&#xff0c;然而&#xff0c;如何更便捷地与这些设备进行交互却是一个不断被探索的课题。本文将主要介绍一个基于 OpenCV 的手势识别项目&#xff0c;通过手势…

Qt程序设计-导出PDF

本文讲解如何实现导出PDF,包含如何使用HTML格式和添加图片。 实例如下: 创建项目,添加两个按钮,并在D盘提前准备好图片。 窗体的头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow>#include <QPrinter> #include <QPainter> #i…

Oracle systemstate、gdb、dbx介绍

当数据库出现严重的性能问题或者hang了的时候&#xff0c; 可能最常用的办法就是重启数据库&#xff0c;简单有效解决问题&#xff1b;但是重启后如何追踪问题的根本原因成了难题&#xff0c;很多信息随着重启也消失不见了&#xff0c;让追查问题变的十分棘手&#xff0c;这时就…

ElementUI鼠标拖动没列宽度

其实 element ui 表格Table有提供给我们一个resizable属性 按官方文档上描述 它就是控制是否允许拖拽表格列大小的属性 而且 它的默认值就是 true 但是依旧很多人会反应拖拽不了 首先 表格要有边框 如果没有变宽 确实是拖拽不了 给 el-table加上 border属性 运行结果如下 但…

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画,Kotlin(二)

Android用setRectToRect实现Bitmap基于Matrix矩阵scale缩放RectF动画&#xff0c;Kotlin&#xff08;二&#xff09; 文章 https://zhangphil.blog.csdn.net/article/details/135980821 实现了基于Matrix缩放Bitmap的动画&#xff0c;但是从左上角&#xff08;0,0&#xff09;位…

cesium-相机的使用

直接上代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item>场景设置实…

基于Springboot的考编论坛网站的设计与实现(有报告)。Javaee项目,springboot项目。

演示视频&#xff1a; 基于Springboot的考编论坛网站的设计与实现&#xff08;有报告&#xff09;。Javaee项目&#xff0c;springboot项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层…

C++ 哈希表(unordered_map与unordered_set)

文章目录 unordered_map 与 unordered_set哈希表 (Hash Table)哈希函数哈希冲突模拟实现封装 补充&#xff1a;unordered_map 与 unordered_set 的使用 unordered_map 与 unordered_set 就和名字一样&#xff0c;这是 map、set 的无序版本&#xff08;数据遍历出来是无序的&am…

如何选择性能测试工具?ab和其它工具的对比分析!

性能测试是保证应用程序高效可靠的重要手段之一&#xff0c;在进行性能测试时&#xff0c;选择合适的性能测试工具非常重要。应当根据测试需求来选择适合的测试工具&#xff0c;本文将会详细介绍ApacheBench&#xff08;简称ab&#xff09;和其他性能测试工具的区别以及如何选择…

RFID手持终端_智能pda手持终端设备定制方案

手持终端是一款多功能、适用范围广泛的安卓产品&#xff0c;具有高性能、大容量存储、高端扫描头和全网通数据连接能力。它能够快速平稳地运行&#xff0c;并提供稳定的连接表现和快速的响应时&#xff0c;适用于医院、物流运输、零售配送、资产盘点等苛刻的环境。通过快速采集…

ROS笔记一:工作空间和功能包

目录 工作空间 如何创建工作空间&#xff1a; 编译工作空间 设置环境变量 功能包 创建功能包 CMakeLists.txt package.xml 工作空间 ROS的工作空间是用来存放工程文件代码的文件夹 ROS的开发依赖于工作空间&#xff0c;包括编写代码、编译等都是在工作空间下进行的 工作空…

ACK One Argo工作流:实现动态 Fan-out/Fan-in 任务编排

作者&#xff1a;庄宇 什么是 Fan-out Fan-in 在工作流编排过程中&#xff0c;为了加快大任务处理的效率&#xff0c;可以使用 Fan-out Fan-in 任务编排&#xff0c;将大任务分解成小任务&#xff0c;然后并行运行小任务&#xff0c;最后聚合结果。 由上图&#xff0c;可以使…