Learning C++ No.9【STL No.1】
引言:
北京时间:2023/2/13/18:29,开学正式上课第一天,直接上午一节思想政治,下午一节思想政治,生怕我们……,但,我深知该课的无聊,所以充分利用时间,把我的小黑书给拿出来看了,发现小黑书就是小黑书,那么的晦涩难懂,虽然我看的非常的仔细,一个字一个字的看,一遍一遍的看,但是很多地方还是不明白,所以我希望我终有一天可以把小黑书的大部分知识搞的七七八八吧!现在,我们就再来学习一下C++中的模板问题。
再聊类模板
通过上篇博客,我们是可以搞定类模板的大致使用的,总的来说就是把类实现成无类型表示的一个模板,然后使用时以尖括号<> 来显示该类模板的类型,从而实现不同类型的类,说以明白了这些,此时我们就再来看一下类模板中的一些小知识点,如:如何实现类模板中函数的声明和定义分离,此时的函数声明和定义分离,不可以像之前的函数声明和定义分离一样,此时类模板中把函数定义在类外,不仅要明确作用域是该类,而且需要加上模板参数,这样才可以把模板中的函数进行声明和定义分离,如图所示:
非模板类的声明和定义分离写法:
Vector::~Vector()
{delete[] _pData;_pData = nullptr;_size = _capacity = 0;
}
模板类的声明和定义分离写法:
template<class T>
Vector<T>::~Vector()
{delete[] _pData;_pData = nullptr; _size = _capacity = 0;
}
模板类的声明和定义分离写法和非模板类声明和定义分离写法最主要的区别就是,模板类的声明和定义分离要加上模板参数,不能只指定作用域类名,但注意:模板类的声明和定义是不允许分成.h文件和.c文件分别声明和定义的,这样会导致链接问题,只有普通的类(也就是非模板类)可以分成两个文件进行声明和定义,模板类是不可以的;并且此时强调,delete和new的注意点:因为使用delete时,仅仅调用了对象数组中第一个对象的析构函数,而使用delete [],将会逐个数组元素调用析构函数,所以当我们遇到了new[]的时候,例:_pData(new T[capacity]),此时我们不可以使用delete _pData;要使用delete[] _pData;才行,所以记住 不仅 new和delete、malloc和free要匹配使用,new[]和delete[]也要匹配使用。
简易的一个顺序表类模板:
#include<iostream>
using namespace std;template<class T>
class Vector
{
public:Vector(size_t capacity = 10):_pData(new T[capacity]),_size(0),_capacity(capacity){}~Vector();void PushBack(const T& data);void PopBack();size_t Size(){return _size;}T& operator[](size_t pos)//把[]进行重载{assert(pos < _size);return _pData[pos];}
private:T* _pData;size_t _size;size_t _capacity;
};
template<class T>
Vector<T>::~Vector()
{delete[] _pData;_pData = nullptr; _size = _capacity = 0;
}int main()
{return 0;
}
浅浅介绍一下STL
搞定了上述的知识和之前的知识,此时我们就可以进入到C++中的另一个重点知识STL的学习了,在正式学习STL之前,我们今天就先浅浅的了解一下什么是STL、STL的重要性、STL版本、STL的六大组件、STL的缺陷和如何学习STL等知识。
什么是STL
STL就是(standard template libaray)的缩写,按照此时的名字来理解就是一个标准模板库,是C++中标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构和算法软件的框架。
STL版本
C++ STL 规范版本正式通过以后,由于其实开源的,各个 C++ 编译器厂商在此标准的基础上,实现了满足自己需求的 C++ STL 泛型库,主要包括 HP STL、SGI STL、STLport、PJ STL、Rouge Wave STL 等。
STL的六大组件
如图所示:

| STL六大组件 | 具体介绍和相关作用 |
|---|---|
| 1.容器(containers) | 各种数据结构,如: vector,list,deque,set,map用来存放数据,从实现角度来看,STL容器是一种class template。 |
| 2.算法(algorithms) | 各种常用算法如sort,search,copy,erase… 从实现角度看,STL算法是一种function template。 |
| 3.迭代器(iterators) | 扮演容器与算法之间的胶合剂,是所谓的“泛型指针”。共有5种类型,以及其它衍生变化。从实现角度来看,迭代器是一种将operator*, operator->, operator++, operator–等相关操作予以重载的class template。所有STL容器都附带有自己专属的迭代器。 |
| 4.仿函数(functors) | 行为类似函数,可作为算法的某种策略(policy),从实现的角度来看,仿函数是一种重载了operator()的 class 或 class template。一般函数指针可视为狭义的仿函数。 |
| 5.配接器(adapters) | 一种用来修饰容器(container)或仿函数(functors)或迭代器(iterators)接口的东西。STL提供的queue和stack, 虽然看似容器,其实只能算是一种容器配接器,因为它们的底部完全借助deque,所有操作都由底层的deque供应。改变functor接口者,称为function adapter;改变container接口者,称为container adapter;改变iterator接口者,称为iterator adapter。 |
| 6.空间配置器(allocators) | (内存池)负责空间配置与管理,从实现角度来看,空间配置器是一个实现动态空间配置,空间管理,空间释放的class template。 |
如何学习STL
第一境界:熟用STL
第二境界:了解泛型技术的内涵与STL的学理乃至实作
第三境界:扩充STL
正式学习STL
从string看STL
搞懂了上述有关STL的知识,此时我们就来学习一下STL中的string类,还是秉承着改善C语言的目标,此时string类出现的目的就是为了解决C语言中有关字符的库函数比较分散,不方便使用和底层空间需要用户自己管理,容易导致越界访问的问题,所以string类的出现,就可以让我们无论是在编写程序,还是做题的时候,都可以非常方便的使用有关的字符函数。
标准库中的string类
英文字母编码
在我们学习string类之前,我们可以先来回顾一下有关编码的内容,相信各位在C语言初阶的时候,都了解过计算机中的编码(ASCII码) ,所以我们就来回顾一下什么是ASCII码 ,从一个问题出发,搞懂什么是ASCII和ASCII的出现原因;我们都知道计算机只能识别由0和1组成的机器语言,并不能识别各种字符,所以此时为了可以在计算机上显示和存储各种字符,此时人们就想到用编码的形式,将各种字符和相应的数字对应起来,从而就生成了我们的ASCII码表,我们通过ASCII码值对各种字符进行使用,此时计算机就可以通过ASCII码值转化为二进制编码,从而识别我的各种字符,具体过程:字符=>ASCII(0—128)=>内存(对应的二进制)=>计算机;如下图所示,我们写了一个字符数组,此时字符数组中有6个字符"apple\0",切记这种写法,字符串的末尾是有"\0"结束的,所以此时我们可以打开调式窗口中的内存选项,搜索字符数组str的地址,此时我们可以发现,该地址有8个字节,并且是以16进制命名的,并且ASCII码值61就是字符a的16进制,70就是字符p的16进制,6c就是字符l的16进制,65就是字符e的16进制,00就是字符\0的16进制,所以此时如图可以得出结论,我们的字符串在内存中存储的就是该字符对应的16进制的ASCII码值。

汉字编码
所以我们搞懂了apple字符在计算机内存中是如何存储的,那么此时就应该想到,我们中国的汉字应该怎么存储呢?我们的汉字博大精深,比26个引文字母不知道多了多少,所 以此时应该怎样在计算机中存储我们的汉字呢? 在上述知识中,我们知道一个英文字符,只需要使用一个字节就够了,因为一个字节是8个比特位,最大值是256,足够编码所有的字符,但汉字是成千上万的,所以此时使用一个字节就不够我们进行对每一个汉字进行编码,所以一般是使用2个字节,两个字节就是2^16,是65536,足够我们对每一个汉字进行编码, 所以一个汉字在内存中最少是占两个字节的,所以此时就会涉及到一个叫万国码的东西,有这个计算机就可以存储各个国家的语言了,这样才使计算机可以在全球流行。

如该图所示,此时的下标0/1表示"你"、2/3表示"好"、4/5表示"世"、6/7表示"界"、8表示"\0",并且此时为了使该编码形式可以兼容ASCII码表,所以在前面都加上了一个负号(-),
注意:二进制编码以0开头就是一个字节编码,以1开头就是两个字节编码。
如果各对万国码感兴趣的话,可以参考该链接:万国码详解
正式学习C++中的string
话不多说,学习某一个函数和某一个类的时候,我们必须去cplusplus这个网站上看一下,该函数或者该类的具体情况,如下图:

发现,该类是封装在std中的,并且原名是basic_string通过重命名(typedef)变成string,并且该类是通过basic_string模板经过实例化得到的一个字符类型(char)的字符串类。并且通过往下阅读,我们可以发现,string有100多个函数,此时我们不需要学习这么多,只要学习其中的20个到30个就行了,所以接下来,我们就开始string类中接口函数的学习。
走进string类内部
如下图,我们可以看出,在string类中重载了很多不同功能的函数,通过它们的参数的个数不同或者参数的类型不同,对这些函数进行重载,所以当我们使用string时,其实本质上是有很多功能可以使用的,主要与参数的类型和个数是有关的,所以现在我们如该图,一个一个的string函数开始学习,具体看一下string类中的string函数都有什么功能。

构造一个字符串对象,根据所使用的构造函数版本初始化其值:(意思就是使用函数重载的方式来构造对象)
与上图中的序号相对应,每个重载函数的功能如下表:
| 重载函数 | 具体功能 |
|---|---|
| (1) 空字符串构造函数(默认构造函数) | 构造一个空字符串,长度为零个字符。 |
| (2) 复制构造函数 | 构造 str 的副本。 |
| (3) 子字符串构造函数 | 复制 str 中从字符位置 pos 开始并跨越 len 字符的部分(如果 str 太短或 len 是字符串::npos,则直到 str 的末尾)。 |
| (4)从C串 | 复制 s 指向的以 null 结尾的字符序列(C 字符串)。 |
| (5) 从缓冲液 | 从 s 所指的字符数组中复制前 n 个字符。 |
| (6) 填充构造函数 | 用字符 c 的 n 个连续副本填充字符串。 |
| (7) 范围构造函数 | 以相同的顺序复制区域 [第一个、最后一个) 中的字符序列。 |
| (8) 初始值设定项列表 | 以相同的顺序复制 il 中的每个字符。 |
| (9) 移动构造函数 | 获取 str 的内容。str 处于未指定但有效的状态。 |
搞定了string函数,此时我们接着去看一看string类中的有关容量的函数。
例如:此时容量中的函数,计算字符串的长度的函数

如图计算字符串长度的函数有两个,一个是size一个是length,两个都可以计算,那么有什么区别呢?
主要的区别就是不同的数据结构类型,在使用上是有所不同的。(我们平时使用size就行了)

所以以上就是所有的有关容量的string类总的成员函数了,下述为这些成员函数的具体使用功能:
| 函数名 | 具体功能 |
|---|---|
| 大小 | 返回字符串的长度(公共成员函数) ) |
| 长度 | 返回字符串的长度(公共成员函数) ) |
| max_size | 返回字符串的最大大小(公共成员函数) ) |
| 调整 | 调整字符串大小(公共成员函数) ) |
| 能力 | 返回已分配存储的大小(公共成员函数) ) |
| 储备 | 请求更改容量(公共成员功能 ) |
| 清楚 | 清除字符串(公共成员函数 ) |
| 空 | 测试字符串是否为空(公共成员函数 ) |
| shrink_to_fit | 缩小以适合(公共成员函数) ) |
string类中的+=运算符使用
了解了上述的函数,我们可以发现,这些函数都比较的鸡肋,接下来我们学习一下string类中的比较实用的函数和运算符。

可以发现我们使用+=运算符对字符串进行增加字符和字符串是比使用push_back和append函数更加优的,不仅可以使代码更加易懂,而且好记好写,但本质上我们都懂+=运算符的重载,还是由push_back和append函数来完成的,只是对push_back和append这两个函数重新进行一定的封装而已。当然这也就是运算符重载的好处。

总结:string在STL中是非常重要的一个类,需要我们慢慢的通过不断摸索,孰能生巧的去逐渐搞定它。
相关文章:
Learning C++ No.9【STL No.1】
引言: 北京时间:2023/2/13/18:29,开学正式上课第一天,直接上午一节思想政治,下午一节思想政治,生怕我们……,但,我深知该课的无聊,所以充分利用时间,把我的小…...
Apifox推荐-django后台验证token配置
最近事情很多,但是我还是想写一片推荐apifox的文章。 优秀的UI,清晰地逻辑,丰富的功能。对于我们这种业余选手来说,他真的很便利。 更新新版后有了更多贴心的功能,让你感觉他是一个有温度的工具。 最重要的是…...
SAS应用入门学习笔记6
SQL (SAS): Features: 1)不需要在每个query中重复调用每个SQL; 2)每个statement都是独立去完成的; 3)我们是没有proc print和proc sort语句的;(order by) key synta…...
【3D目标检测】Pseudo-Stereo for Monocular 3D Object Detection in Autonomous Driving
目录概述细节背景与整体流程图像级别生成特征级别生成损失函数学习深度感知的特征概述 本文是基于单目图像的3D目标检测方法。 【2021】【MonoDLE】 研究的问题: 能否借助立体图像检测算法提高单目图像检测的效果如何实现右侧图像的生成 解决的方法: 受启发于伪…...
git 常用命令之 git branch
大家好,我是 17。 新建 git 分支 分支是并行开发的基础。分支名称的本质是对分支最后一个提交的引用。分支有多个,但 HEAD 只有一个,可以认为 HEAD 是"current branch"(当下的分支)。当你用git switch切换分支的时候,…...
Oracle数据泵
Oracle 数据泵:概览 作为一个基于服务器的用于高速移动数据与元数据的工具, Oracle 数据泵具有以下特点: •可通过 DBMS_DATAPUMP 调用 •可提供以下工具: – expdp – impdp – 基于 Web 的界面 •提供四种数据移动方法ÿ…...
ACWING寒假每日一题python
ACWING寒假每日一题 一、孤独的照片 一个点一个点的来看,比如对于GHGHG中间的G,找到他的左边的G,以及右边的G的位置,l,r分别等于1,答案就要多加上11 但是如果对于 GHHGHHG 中间的G,我们可以看到l,r等于2&a…...
御黑行动来袭--助力三月重保,构筑安全防线!
三月重保在即,重要网站及业务系统“零风险 零事故”是终极目标,作为业界网络安全实战派“老兵”--知道创宇将一如既往,为您提供重保期间“万无一失”的重要网站及业务系统防护。 值此三月重保的重要备战期,知道创宇推出由主力产品…...
JavaScript HTML DOM 元素 (节点)
HTML DOM 是指 HTML 文档对象模型,它是一种用于创建和处理 HTML 页面的标准 API。在 JavaScript 中,HTML DOM 可以被用来操作和修改网页的内容和结构。在本篇文章中,我们将详细探讨 JavaScript HTML DOM 元素 (节点)的作用以及在实际工作中的…...
mybatis-plus ---2
mybatis-plus插件 官网地址 分页插件 MyBatis Plus自带分页插件,只要简单的配置即可实现分页功能 配置并使用自带分页插件 Configuration MapperScan("com.itzhh.mapper")//可以将主类中的注解移到此处 public class MybatisPlusConfig {Beanpublic …...
如何在Qt中设置背景图片,且不覆盖其它控件
正常情况,我们直接通过在样式表里设置背景图片会出现背景图片覆盖其它控件的情况,比如下面操作: 首先右击空白处,点击改变样式表。 然后选择background-image 然后点击铅笔图标 之后我们要先添加前缀,也就是我们…...
PMP考前冲刺2.14 | 2023新征程,一举拿证
承载2023新一年的好运让我们迈向PMP终点一起冲刺!一起拿证!每日5道PMP习题助大家上岸PMP!!!PMP项目管理题目1-2:1.公司了解到一个项目机会,领导让之前做过类似项目的项目经理报告一个粗略的成本…...
feign进行文件上传报错解决方案及有多个入参时的注意事项
一、情景回顾1、简单的文件上传的接口/*** 文件上传MultipartFile格式** param multipartFile 源文件* param filename 自定义文件名称,允许为空,为空时直接从源文件中拿* return*/RequestMapping("/uploadFileForMultipartFile")LogModuleAnn…...
java 枚举类型enum的用法详解
Java Enum原理 public enum Size{ SMALL, MEDIUM, LARGE, EXTRA_LARGE }; 实际上,这个声明定义的类型是一个类,它刚好有四个实例,在此尽量不要构造新对象。 因此,在比较两个枚举类型的值时,永远不需要调用equals方法…...
Java 基础面试题——关键字
目录1.Java 中的关键字是指什么?有哪些关键字?2.instanceof 关键字的作用是什么?3.访问修饰符 public、private、protected、以及不写(default)时的区别?4.Java 中有没有 goto 关键字?5.在 Java 中&#x…...
C++——运算符重载
1、运算符重载的概念 运算符重载,就是对已有的运算符重新进行定义,赋予其另一种功能,以适应不同的数据类型。运算符重载的目的是让语法更加简洁运算符重载不能改变本来寓意,不能改变基础类型寓意运算符重载的本质是另一种函数调用…...
前端食堂技术周刊第 70 期:Volar 的新开端、Lighthouse 10、良好的组件设计、React 纪录片、2022 大前端总结
美味值:🌟🌟🌟🌟🌟 口味:黑巧克力 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Volar 的新开端Chrome 110 的新功能Lighthouse 10Nuxt v3.2.0加速 JavaSc…...
react路由详解
在学习react路由之前,我们肯定需要安装路由。大家先运行如下命令安装路由。安装之后随我一起探索react路由。 安装 版本v6 npm i react-router-dom -S 页面准备 创建两个文件夹 pages和 router pages文件夹里面放的是页面 router文件夹里面是进行路由配置 路由…...
mysql数据库完全备份和增量备份与恢复
mysql数据备份: 数据备份方式 物理备份: 冷备:.冷备份指在数据库关闭后,进行备份,适用于所有模式的数据库热备:一般用于保证服务正常不间断运行,用两台机器作为服务机器,一台用于实际数据库操作应用,另外…...
CF1667E Centroid Probabilities
题目描述 对于所有点数为 nnn 的树,如果其满足 对于所有 i∈[2,n]i\in [2,n]i∈[2,n],与 iii 相连的 jjj 中有且只有一个点 jjj 满足 j<ij<ij<i ,那么我们称其为好树 对于 1∼n1\sim n1∼n 每个点求出来有多少好树满足重心为 iii …...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
数据链路层的主要功能是什么
数据链路层(OSI模型第2层)的核心功能是在相邻网络节点(如交换机、主机)间提供可靠的数据帧传输服务,主要职责包括: 🔑 核心功能详解: 帧封装与解封装 封装: 将网络层下发…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...
Python如何给视频添加音频和字幕
在Python中,给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加,包括必要的代码示例和详细解释。 环境准备 在开始之前,需要安装以下Python库:…...
微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
C++八股 —— 单例模式
文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全(Thread Safety) 线程安全是指在多线程环境下,某个函数、类或代码片段能够被多个线程同时调用时,仍能保证数据的一致性和逻辑的正确性…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)
引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...

