stl大全

2023-05-16

什么是STL?

大佬:为什么C++比C更受人欢迎呢?除了C++ 的编译令人感到更舒适,C++的标准模板库(STL)也占了很重要的原因。当你还在用手手写快排、手写二叉堆,挑了半天挑不出毛病的时候,C++党一手STL轻松AC,想不嫉妒都难。img

萌新:STL太酷了吧,快跟我讲讲具体是什么玩意吧!img

大佬:STL(Standard Template Library,标准模板库),是惠普实验室开发的一系列软件的统称。现在主要出现在 c++中,但是在引入 c++之前该技术已经存在很长时间了。STL 从广义上分为: 容器(container) 算法(algorithm) 迭代器(iterator),容器和算法之间通过迭代器进行无缝连接。STL 几乎所有的代码都采用了模板类或者模板函数,这相比传统的由函数和类组成的库来说提供了更好的代码重用机会。

萌新:蛤??????说了这么多!还是不知道STL是个啥呀!img

大佬:别着急,上面那是百度文库的东西,你不用理会哈~我们一步步走着瞧,来开启学习STL的大门吧!

萌新:大佬NB!img

STL容器有哪些呢?

大佬:STL容器太多了,我可不能讲完,要讲的太细,我们做算法不用,理解起来也十分困难,我就来和你聊聊最常用的STL库中的几个容器吧: vector(动态数组), queue(队列), stack(栈) , string(字符串) , set(集合),map(映射容器)!

萌新:感谢大佬理解!

浅谈C++ STL vector 容器

大佬:你知道vector的中文是啥意思嘛?

萌新:emmm,是矢量的意思吧!img

大佬:NONONO! vector和高中物理、几何等东西没有任何关系。它在计算机里就叫做:动态数组!我们知道,一个数组必须要有固定的长度,在开一个数组的时候,这个长度也就被静态地确定下来了。但是vector却是数组的“加强版”,对于一组数据来讲,你往vector里存多少数据,vector的长度就有多大。也就是说,我们可以将其理解为一个“变长数组”。

萌新:原来如此!!img

大佬:

接下来细细讲讲vector用法:

vector容器的声明:

vector容器存放在模板库:#include<vector>里,使用前需要先开这个库。

vector容器的声明遵循C++STL的一般声明原则:

容器类型<变量类型> 名称

例:

#include<vector>
vector<int> vec;
vector<char> vec;
vector<pair<int,int> > vec;
vector<node> vec;
struct node{...};

vector容器的使用方法:

vector容器的使用方法大致如下表所示:

用法作用
vec.begin(),vec.end()返回vector的首、尾迭代器
vec.front(),vec.back()返回vector的首、尾元素
vec.push_back()从vector末尾加入一个元素
vec.size()返回vector当前的长度(大小)
vec.pop_back()从vector末尾删除一个元素
vec.empty()返回vector是否为空,1为空、0不为空
vec.clear()清空vector

除了上面说过的那些之外,我们的vector容器是支持随机访问的,即可以像数组一样用[][]来取值。请记住,不是所有的STL容器都有这个性质!在STL的学习过程中,一定要清楚各个容器之间的异同!

萌新:emmm看了这么多!有没有什么具体的,能实际操作的东西让我们练练手呢?我想自己试试!img

大佬:来吧!给你题目了哦!

vector语法练习.cpp

萌新:这也太简单了吧!嘿嘿嘿!img

大佬:好!那就继续咯~

浅谈C++ STL queue 容器

大佬:queue在英文中是队列的意思。队列是一种基本的数据结构。而C++STL中的队列就是把这种数据结构模板化了。我们可以在脑中想象买票时人们站的排队队列。我们发现,在一个队列中,只可以从队首离开,从队尾进来(没有插队,想啥呢)。即一个先进先出的数据结构。

上图理解:

img

萌新:这不so easy嘛!快点快点!我想一口吃个大胖子!!img

大佬:嘿嘿!鸡汤来喽!

queue容器的声明

queue容器存放在模板库:#include<queue>里,使用前需要先开这个库。

queue容器的声明遵循C++STL的一般声明原则:

容器类型<变量类型> 名称

例:

#include<queue>

queue<int> q;

queue<char> q;

queue<node> q;

struct node{...};

queue容器的使用方法

queue容器的使用方法大致如下表所示:

用法作用
q.front(),q.back()返回queue的首、尾元素
q.push()从queue末尾加入一个元素
q.size()返回queue当前的长度(大小)
q.pop()从queue末尾删除一个元素
q.empty()返回queue是否为空,1为空、0不为空

注意,虽然vector和queue是两种最基本的STL容器,但请记住它们两个不是完全一样的。就从使用方法来讲:

queue不支持随机访问,即不能像数组一样地任意取值。并且,queue并不支持全部的vector的内置函数。比如queue不可以用clear()函数清空,清空queue必须一个一个弹出。同样,queue也并不支持遍历,无论是数组型遍历还是迭代器型遍历统统不支持,所以没有begin(),end();函数,使用的时候一定要清楚异同!

queue语法练习.cpp

萌新:噢噢!这里还有这么多小细节呀!好的好的,我会记住的!img

浅谈C++ STL stack 容器

大佬:stack在英文中是栈的意思。栈是一种基本的数据结构。而C++STL中的栈就是把这种数据结构模板化了。
栈的示意图如下:这是一个先进后出的数据结构。这非常重要!!
img
事实上,stack容器并不是一种标准的数据结构,它其实是一个容器适配器,里面还可以存其他的STL容器。但那种使用方法过于高深而且不是很常用,所以在此不与介绍。请有兴趣的小萌新们可以自行查询资料。

萌新:呼呼!学了这么多!看似很简单,但是记忆的东西还是好多啊!头有点晕晕的!能不能缓缓啊!img

大佬:哈?这就不行了?告诉你呀!能靠记忆解决的东西是最简单的!到这里就放弃了,你可就太逊了哦!赶快打起精神来,复习复习前面两个容器,我们接着继续!img

萌新:竟然说我菜!啊!气死了!不行,我得学给你看!来吧!

大佬:嘿嘿!鸡汤来喽!

stack容器的声明

stack容器存放在模板库:#include<stack>里,使用前需要先开这个库。
stack容器的声明遵循C++STL的一般声明原则:
容器类型<变量类型> 名称
例:

#include<stack>
stack<int> st;
stack<char> st;
stack<pair<int,int> > st;
stack<node> st;
struct node{...};

stack容器的使用方法

stack容器的使用方法大致如下表所示:

用法作用
st.top()返回stack的栈顶元素
st.push()从stack栈顶加入一个元素
st.size()返回stack当前的长度(大小)
st.pop()从stack栈顶弹出一个元素
st.empty()返回stack是否为空,1为空、0不为空

浅谈C++ STL string容器

萌新:呜呜呜< _ >怎么这么多!img

大佬:别着急这才哪跟哪,谁跟谁呢!来来,继续"喝",别停哦!

萌新:我尽量img

大佬:其实string并不是STL的一种容器,但是由于它的使用方法等等和STL容器很像,所以就把它当作STL容器一样介绍。

其实string容器就是个字符串,这通过它的英文译名就能看得出来。但是对于字符串以及字符串的相关操作,可能读者还是对普通的C/C++的#include<cstring>#include<string.h>库更熟悉一些。我丝毫不否认这些传统字符操作的经典性和实用性,但是由于它们函数定义的局限,有些时候对于一些特殊的读入、输出、遍历等要求,它的操作并不如string容器好用。

比如,要求读入一群中间可能带空格的字符串,如果用传统方式进行读入,可能就会很麻烦,但是如果使用string的话,一个读入函数就可以完全搞定。

string容器的使用方法及与传统字符读入的对比

一张图解决问题。

img

详解C++ STL set 容器

大佬:我知道你要抱怨了,停下你的抱怨哦,这下乖乖听我讲课!好好听才能学好!知道了不!

萌新:看来还是你懂我呀!我会加油的!img

大佬:不罗嗦了!直接来干货!

set容器的概念和性质

set在英文中的意义是:集合。set容器也的确“人如其名”,实现了这个集合的功用。

高中数学必修一集合那章(高一以下的小伙伴不用慌,不讲数学只讲概念),关于集合的性质,给出了三个概念:无序性、互异性、确定性

那么,set容器的功用就是维护一个集合,其中的元素满足互异性。

我们可以将其理解为一个数组。这个数组的元素是两两不同的。

这个两两不同是指,如果这个set容器中已经包含了一个元素i,那么无论我们后续再往里假如多少个i,这个set中还是只有一个元素ii,而不会出现一堆i的情况。这就为我们提供了很多方便。

set容器的声明

set容器的声明和大部分C++STL容器一样,都是:容器名<变量类型> 名称的结构。前提需要开#include库。如:

#include<set>
set<int> s;
set<char> s;
set<pair<int,int> > s;
set<node> s;
struct node{...};

set容器的使用

其实,C++STL容器的使用方式都是差不多的。我们完全可以举一反三地去类比。

s.empty();

empty()函数返回当前集合是否为空,是返回1,否则返回0.

s.size();

size()函数返回当前集合的元素个数。

s.clear();

clear()函数清空当前集合。

s.begin(),s.end();

begin()函数和end()函数返回集合的首尾迭代器。注意是迭代器。我们可以把迭代器理解为数组的下标。但其实迭代器是一种指针。这里需要注意的是,由于计算机区间**“前闭后开”**的结构,begin()函数返回的指针指向的的确是集合的第一个元素。但end(返回的指针却指向了集合最后一个元素后面一个元素。

s.insert(k);

insert(k)函数表示向集合中加入元素k。

s.erase(k);

erase(k)函数表示删除集合中元素k。这也反映了set容器的强大之处,指哪打哪,说删谁就删谁,完全省略了遍历、查找、复制、还原等繁琐操作。更不用像链表那种数据结构那么毒瘤。直接一个函数,用O(logn)的复杂度解决问题。

s.find(k);

find(k)函数返回集合中指向元素k的迭代器。如果不存在这个元素,就返回s.end(),这个性质可以用来判断集合中有没有这个元素。

set语法练习.cpp

详解C++ STL map 容器

大佬:好了好了!最后一个知识点了!马上搞定了哦!别着急!

萌新:其实吧,学了这么多!我还越学越上头!再来再来!img

大佬: 好!那废话就不多说了!直接进入核心!

map容器的概念

map的英语释义是“地图”,但map容器可和地图没什么关系。map是**“映射容器”**,其存储的两个变量构成了一个键值到元素的映射关系。

比如下图:

img

我们可以根据键值快速地找到这个映射出的数据。

map容器的内部实现是一棵红黑树(平衡树的一种),因为比较复杂而且与理解并无多大关系,所以不予介绍,有兴趣的小萌新可以自己查阅相关的资料。

map容器的声明

map容器存在于STL模板库#include<map>中。使用的时候需要先开这个库。

比如:

#include<map>
map<int,char> mp;

这就建立了一个从一个整型变量到一个字符型变量的映射。

map容器的用法

1.常规操作

如其他C++STL容器一样,map支持基本相同的基本操作:

比如清空操作,函数clear(),返回容器大小size(),返回首尾迭代器begin(),end()等。

2.插入操作

map容器的插入操作一种是类似于数组类型,可以把键值作为数组下标对map进行直接赋值:

mp[1]='a';

3.删除操作

可以直接用erase()函数进行删除,如:

mp.erase('b');

4.遍历操作

和其他容器差不多,map也是使用迭代器实现遍历的。如果我们要在遍历的时候查询键值(即前面的那个),可以用it->first来查询,那么,当然也可以用it->second查询对应值(后面那个)

5.查找操作

查找操作类比set的查找操作。但是map中查找的都是键值。

比如:

mp.find(1);

即查找键值为1的元素。

map集合语法练习.cpp

萌新:太好了!终于学完了!呼呼快让我休息一会吧!img

大佬:现在正是成热打铁的时候,一定别忘记课后复习呀!!!

萌新:收到!要想变强!就得吃苦!我去复习了大佬!冲!

mp[1]='a';

3.删除操作

可以直接用erase()函数进行删除,如:

mp.erase('b');

4.遍历操作

和其他容器差不多,map也是使用迭代器实现遍历的。如果我们要在遍历的时候查询键值(即前面的那个),可以用it->first来查询,那么,当然也可以用it->second查询对应值(后面那个)

5.查找操作

查找操作类比set的查找操作。但是map中查找的都是键值。

比如:

mp.find(1);

即查找键值为1的元素。

map集合语法练习.cpp

萌新:太好了!终于学完了!呼呼快让我休息一会吧![外链图片转存中…(img-GpCvdVCd-1646987505961)]

大佬:现在正是成热打铁的时候,一定别忘记课后复习呀!!!

萌新:收到!要想变强!就得吃苦!我去复习了大佬!冲!

img

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

stl大全 的相关文章

随机推荐

  • 【OpenCV教程】OpenCV中的数据类型

    文章目录 1 CV 8U2 CV 8S3 CV 16U4 CV 16S5 CV 16F6 CV 32S7 CV 32F8 CV 64F9 一图流 1 CV 8U CV 8U 占8位的unsigned CV 8UC n 占8位的unsigne
  • 【ROS教程】安装ROS全流程及可能遇到的问题

    文章目录 1 配置Softerware amp Updates2 添加软件源3 设置key4 更新并安装4 1 更新4 2 安装 ros noetic desktop full 4 2 1 安装aptitude4 2 2 安装ROS软件包
  • 【unix】unix环境高级编程

    文章目录 1 UNIX基础知识1 基本知识2 文件和目录3 输入和输出4 程序和进程5 出错处理6 用户标识7 信号8 时间9 系统调用和库函数 标准化和实现1 标准化 ISO C POSIX Single UNIX Specificati
  • 在 Ubuntu 中安装 VSCode

    在 Ubuntu 中安装 VSCode 如果想要通过 ubuntu 安装 vscode 有三种方式 xff0c 可以通过应用中心下载 xff0c 也可以通过安装包下载 xff0c 以及指令安装 方式一 xff1a 首先在 ubuntu 桌面
  • 常用命名规范分类:匈牙利命名法、下划线命名法、驼峰命名法、帕斯卡命名法

    目录 1 匈牙利命名法 xff08 Hungarian xff09 变量属性 2 下划线命名法 xff08 UnderScoreCase xff09 3 驼峰命名法 xff08 小驼峰命名法 xff09 xff08 Camel xff09
  • keil5无法跳转自己要查询的函数

    之前用keil5的时候想要查询函数的意思 xff0c 去跳转结果给我报错 xff0c 出现这个报错信息 原因是编译的时候没有勾选这个按钮 xff1a 勾选上之后重新编译就不会报错了
  • Linux 安装 Node.js | NPM

    超级简单 yum y install nodejs 验证安装 安装node js 会自动一起安装npm 注意 python V 是大写字母V 错写为小写会进入python的编辑模式 执行exit 退出 执行node 启动node终端 两次C
  • 树莓派连接不上WIFi,VNC失效,SSH失效

    笔记 xff1a 树莓派连接不上wifi的解决方法 xff1a 1 xff0c usb连接手机 xff0c 手机设置中搜索 xff0c usb共享网络 xff0c 然后代开usb连接网络 2 xff0c 右键树莓派wifi标志符 xff0c
  • C++中类的运算符重载教程(一),内附完整代码与解析

    目录 xff1a 一 xff1a 加号运算符重载 对 43 重载函数的理解 xff1a xff08 个人理解 xff0c 仅供参考 xff09 二 xff1a 左移运算符的重载 对 lt lt 重载函数的理解 xff08 个人理解 xff0
  • 关于ros中pcl_ros和ros链接问题Makefile:140的一种解决方案

    本人在ros学习pcl和slam过程中 xff0c 使用catkin make进行编译 xff0c 最终只报了错误Makefile 140和make j4 l4错误 xff0c 诸如此类错误 xff0c 多为链接过程出现问题 坑多日 xff
  • rosbag播放过程ctrl+z暂停后继续播放的方法

    rviz 43 rosbag播放暂停与继续播放 rosbag播放暂停的方式可以在rosbag运行窗口 space按键进行控制 该方法用于进程管理的学习扩展 问题描述 xff1a rosbag包播放过程ctrl 43 z暂停播放恢复播放方法
  • github上docker镜像创建容器

    docker介绍 三个概念 1 镜像 xff1a 类似于模版 xff0c 在没有添加实例化前不能使用 2 容器 xff1a 镜像实例化 3 docker xff1a 放容器的一个载体 总结 xff1a docker就像一艘船 xff0c 上
  • vi/vim基本命令

    目录 打开创建文档模式介绍显示行号增删改查光标移动文档操作 打开创建文档 span class token function vim span hello txt 打开已存在hello txt文档或者创建一个不存在的hello txt文档
  • 关于leetcode刷题详细介绍

    虽然刷题一直饱受诟病 xff0c 不过不可否认刷题确实能锻炼我们的编程能力 xff0c 相信每个认真刷题的人都会有体会 现在提供在线编程评测的平台有很多 xff0c 比较有名的有 hihocoder xff0c LintCode xff0c
  • leetcode:13罗马数字转整数c++

    思路分析 两种情况 1 不同的罗马数字都是从左到右依次相加 2 不同的就是末尾数是4和9的情况 xff0c 也就是IV VIV xff08 if xff09 代码框架 整体过程 从题目中字符和数字的对应关系 xff0c 不难想到数据结构un
  • leetcode:20有效的括号——stack

    思路分析 题目匹配的情况有两中 xff1a 和 xff08 xff09 匹配成功的思路是每个 或者其他右包围结构都是和最近的 或者其他左包围结构匹配 最近 匹配的思想应该使用stack结构对数据进行操作 代码框架 1 遍历整个string
  • leetcode:21合并两个有序连表——slist

    思路分析 链表 xff1a 头节点为空 xff0c 每个节点有一个指针 xff0c 指向下一个节点的地址 俩链表节点之间比较 xff0c 用遍历 96 96 for xff0c 因为是list xff0c 可以直接通过迭代器 xff08 指
  • leetcode:53最大子数组和

    思路分析 有2个变量是一直变化的 1 最大集合的第一个元素 2 存放最大的变量 0 变量初始化 span class token keyword int span res span class token operator 61 span
  • Ubuntu安装docker及出现问题解决

    Ubuntu安装docker及出现问题解决 文章目录 Ubuntu安装docker及出现问题解决一 安装docker二 解决docker安装成功后 xff0c docker命令无法正常使用的问题 一 安装docker docker的安装可参
  • stl大全

    什么是STL xff1f 大佬 xff1a 为什么C 43 43 比C更受人欢迎呢 xff1f 除了C 43 43 的编译令人感到更舒适 xff0c C 43 43 的标准模板库 xff08 STL xff09 也占了很重要的原因 当你还在