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 …...
全网详细总结com.alibaba.fastjson.JSONException: syntax error, position at xxx常见错误方式
文章目录1. 复现问题2. 分析问题3. 解决问题4. 该错误的其他解决方法5. 重要补充1. 复现问题 今天在JSONObject.parse(json)这个方法时,却报出如下错误: com.alibaba.fastjson.JSONException: syntax error, position at 0, name usernameat com.aliba…...
快速部署个人导航页:美好的一天从井然有序开始
很多人都习惯使用浏览器自带的收藏夹来管理自己的书签,然而收藏夹存在着一些问题。 经过长时间的累积,一些高频使用的重要网站和偶尔信手收藏的链接混在了一起,收藏夹因为内容过多而显得杂乱无章;收藏夹没有什么美观可言…...
【Python】如何在 Python 中使用“柯里化”编写干净且可重用的代码
对于中级Python开发者来说,了解了Python的基础语法、库、方法,能够实现一些功能之后,进一步追求的就应该是写出优雅的代码了。 这里介绍一个很有趣的概念“柯里化”。 所谓柯里化(Currying)是把接受多个参数的函数变换…...
ROS笔记(4)——发布者Publisher与订阅者Subscribe的编程实现
发布者 以小海龟的话题消息为例,编程实现发布者通过/turtle1/cmd_vel 话题向 turtlesim节点发送消息,流程如图 步骤一 创建功能包(工作空间为~/catkin_ws/src) $ cd ~/catkin_ws/src $ catkin_create_pkg learning_topic roscpp rospy s…...
Linux进程概念(一)
文章目录Linux进程概念(一)1. 冯诺依曼体系结构2. 操作系统(Operator System)2.1 考虑2.2 如何理解操作系统对硬件做管理?2.3 操作系统为什么要对软硬件资源做管理呢?2.4 系统调用和库函数概念2.5 计算机体系结构3. 进程的初步理解…...
Leetcode.1124 表现良好的最长时间段
题目链接 Leetcode.1124 表现良好的最长时间段 Rating : 1908 题目描述 我们认为当员工一天中的工作小时数大于 8 小时的时候,那么这一天就是「劳累的一天」。 所谓「表现良好的时间段」,意味在这段时间内,「劳累的天数」是严格…...
达梦数据库会话、事务阻塞排查步骤
查询阻塞的事务IDselect * from v$trxwait order by wait_time desc;--单机select * from v$dsc_trxwait order by wait_time desc;–DSC集群查询阻塞事务的会话信息select sf_get_session_sql(sess_id),* from v$sessions where trx_id69667;--单机select sf_get_session_sql(…...
sqlServer 2019 开发版(Developer)下载及安装
下载软件 官网只有2022的,2019使用百度网盘进行下载 安装下崽器 选择自定义安装 选择语言、以及安装位置 点击“安装” 安装 SQL Server 可能的故障 以上步骤安装后会弹出以上界面,如果未弹出,手动去安装目录下点击 SETUP.EXE 文件…...
使用Arthas定位问题
功能概述 首先,Arthas的常用功能大概有以下几个: 解决依赖冲突 sc命令:模糊查看当前 JVM 中是否加载了包含关键字的类,以及获取其完全名称。 sc -d 关键字 注意使用 sc -d 命令,获取 classLoaderHash命令:…...
性能测试之tomcat+nginx负载均衡
nginx tomcat 配置准备工作:两个tomcat 执行命令 cp -r apache-tomcat-8.5.56 apache-tomcat-8.5.56_2修改被复制的tomcat2下conf的server.xml 的端口号,不能与tomcat1的端口号重复,不然会启动报错 ,一台电脑上想要启动多个tomcat,…...
音乐类网站开发/网络域名
问题的描述:给定两个标架(O-xyz),其中包括原点的位置和三个坐标轴的向量表示(在笛卡尔坐标中)。我们的目标是找到旋转矩阵将这两个标架进行对齐。 这个问题很简单:可以转换为给定四对点:O1,X1,Y1,Z1和O2,X2,Y2,Z2,求一…...
怎样套用wordpress模板/免费推广工具
如何快速定位消耗 CPU 最高的 sql 语句,怎么做?看看下面的介绍。 概述 如果是Oracle数据库我们可以很容易通过sql来定位到当前数据库中哪些消耗CPU高的语句,而mysql数据库可以怎么定位呢?这里用一个简单例子说明下... 主要是了…...
在线制图网/seo排名谁教的好
Talk Is Cheap和Java一样,python也提供了对于checked exception和unchecked exception. 对于checked exception,我们通常使用try except可以显示解决,对于unchecked 异常,其实也是提供回调或者是钩子来帮助我们处理的,我们可以在钩子里面记录崩溃栈追踪或者发送崩溃数据.下面代…...
随州网站设计开发制作/百度广告官网
java开发与测试人员比例参加JAX测验-只需单击我们(极其科学开发的)Java个性测试和我们的 先进的机器学习算法 测验将计算数字,并告诉您您实际上是什么样的开发人员。 Java开发人员个性测验 信息图–您的Javatar是什么? 另外&am…...
政府网站模板 php/seo sem是什么意思
恒大文化旅游城售楼部位置外地人可以买吗优选好房福田项目规划总占地14565亩,项目整体规划分三期开发,目前开发为首期,占地2188亩。欧式古典风情建筑,红蓝色坡屋顶,外观典雅靓丽。集合精装洋房、精装高层、精装酒店式公…...
wordpress邮箱备份/国内新闻大事20条
要使vue支持ts写法,我们需要用到vue-property-decorator,这个组件完全依赖于vue-class-componet 首先安装: npm i -D vue-property-decorator Model(event?: string, options: (PropOptions | Constructor[] | Constructor) {}) Model装…...