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 …...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
Leetcode 3576. Transform Array to All Equal Elements
Leetcode 3576. Transform Array to All Equal Elements 1. 解题思路2. 代码实现 题目链接:3576. Transform Array to All Equal Elements 1. 解题思路 这一题思路上就是分别考察一下是否能将其转化为全1或者全-1数组即可。 至于每一种情况是否可以达到…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
系统设计 --- MongoDB亿级数据查询优化策略
系统设计 --- MongoDB亿级数据查询分表策略 背景Solution --- 分表 背景 使用audit log实现Audi Trail功能 Audit Trail范围: 六个月数据量: 每秒5-7条audi log,共计7千万 – 1亿条数据需要实现全文检索按照时间倒序因为license问题,不能使用ELK只能使用…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
2.Vue编写一个app
1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module
1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

