当前位置: 首页 > news >正文

[C++]:8.C++ STL引入+string(介绍)

C++ STL引入+string(介绍)

  • 一.STL引入:
    • 1.什么是STL
    • 2.什么是STL的版本:
      • 2-1:原始版本:
      • 2-2:P. J 版本:
      • 2-3:RW 版本:
      • 2-4:SGL版本:
    • 3.STL 的六大组件:
    • 4.STL的意义:
  • 二.string类:
    • 1.string 类:
    • 2.流插入和流提取操作符:
    • 3.赋值操作符:
    • 4.string类的常见构造:
      • string()
      • string(const char*)
      • string(size_t n,char C)
      • string(const string& s) :拷贝构造
      • string(const string& s,size_t pos,size_t len = npos):范围拷贝
      • 补充:析构函数是自动调用的。
    • 5.容量相关的代码:
      • size() :返回字符串有效字符串长度数
      • length() :返回字符串有效字符串长度数
      • max_size():返回类可以开辟的空间最大的数值:
      • capacity():返回空间总大小:
        • capacity 检测代码:
      • empty():判断字符串是否为空串,空返回true ,不为空返回false
      • clear()清空有效字符
      • reserve()为字符串预留空间
      • resize() 将有效字符改成n个并且多的使用字符C填充
    • 6.string 类对象的遍历:
      • 6-1:通过重载的[]下标访问操作符:
      • 6-2:通过iterator迭代器实现遍历:
      • 6-3:通过string 的迭代器可以类比其他的容器的迭代器:
      • 6-4:通过范围for实现遍历:
    • 7.元素访问:
      • operator[]
      • at
    • 8.修改方面的方法:
      • append
      • operator+= 好处:
    • 9.两个算法:
      • 7-1:逆置算法:reverse()
      • 7-2:交换算法:
    • 8:四个练习题:
      • 8-1:把字符串转换成整数:
      • 8-2:反转字符串:
      • 8-3:字符串中第一个唯一字符:
      • 8-4:字符串相加:

一.STL引入:

1.什么是STL

STL(standard template libaray 标准模板库):是C++ 标准库(还包括有IO库:智能指针库:)的重要组成部分,不仅仅是一个可以复用的组件库,而且还是一个包含数据结构与算法的软件框架。

2.什么是STL的版本:

2-1:原始版本:

Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。
唯一的条件就是也需要向原始版本一样做开源使用。(如果你写了一个库是基于STL的内容进行的修改那么这个库需要进行开源)
……
HP 版本–所有STL实现

2-2:P. J 版本:

由P.J plauger 开发,继承自hp版本,windows visual C++ 采用,不可以公开和修改。

2-3:RW 版本:

由Rouge Wage 开发,继承自hp版本,被C++ buider 采用,不可以公开或者修改。

2-4:SGL版本:

由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本。

3.STL 的六大组件:

在这里插入图片描述

4.STL的意义:

STL是C++中重要的作品有了STL许多底层的数据结构和算法都不需要自己重新造轮子。可以让我们站在巨人的肩膀上进行快速高效的开发!

总结:STL学习的三个境界:能用,明理,能扩展。

二.string类:

引入:在C语言中,字符串是用\0结尾的一串字符的集合,为了方便操作C语言提供了一系列的字符串系列的函数,但是这些库函数是和字符串是分离开来的不符合面向对象的思想,并且字符串空间的数据需要用户自己管理和释放容易导致产生越界访问!

1.string 类:

1.我们会发现string类是由一个basic_string 一个类模板实例化生成的一个类的typedef 重命名的。
2.使用需要带头文件()和 using namespace std;

在这里插入图片描述

2.流插入和流提取操作符:

string类重载了流插入和流提取操作符,他们是类的友元函数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

运行代码可以得到几个结论:
1.cout正常打印字符串内容包括空格:
2.cin不可以插入中间存在空格的字符串,只能把第一个空格之前的内容输入进字符串对象中。

3.赋值操作符:

在这里插入图片描述
支持:
string=string
string = const char*
string = char

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.string类的常见构造:

string()

构造空的字符串类对象
在这里插入图片描述

string(const char*)

用常量字符串构造string对象:
在这里插入图片描述

string(size_t n,char C)

个数+字符的形式的构造函数:
在这里插入图片描述

string(const string& s) :拷贝构造

在这里插入图片描述

string(const string& s,size_t pos,size_t len = npos):范围拷贝

1.从s的pos位置开始拷贝len个字符到新的字符串里面去!
2.npos的默认缺省值为-1 但是因为len类型为size_t 类型所以默认值是非常大的!
3.len的值比较大的时候如果被拷贝的字符串后面没有字符了就不会拷贝了!

在这里插入图片描述
在这里插入图片描述

补充:析构函数是自动调用的。

5.容量相关的代码:

size() :返回字符串有效字符串长度数

在这里插入图片描述

length() :返回字符串有效字符串长度数

在这里插入图片描述
总结:为什么有两个方法都可以计算字符串的有效字符个数,因为STL库的出现没有string这个类早,早的时候使用的是length计算个数。后来STL库出来之后使用size方法计算各种类的元素个数所以又给string类添加了一个方法用来计算有效字符个数。

ps:下面内容后面会补充

max_size():返回类可以开辟的空间最大的数值:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

总结:可以开辟的最大空间的大小是根据不同位数区分但是不止于此在不同的编译器下也会不一样
注意:方法美其名日可以开辟这么大的空间但是是开辟不了这么大的空间的下面可以进行验证:

capacity():返回空间总大小:

在vs下:
在这里插入图片描述

在sgl下:

1.在g++下默认空字符串是不会去开空间就是不存在默认空间。
在这里插入图片描述
在这里插入图片描述

capacity 检测代码:

在vs下检测扩容机制:
在这里插入图片描述

在sgl下检测扩容机制:
1.默认从0开始,第一个数据进来开一个空间,然后开两个,到4个一直以二倍进行扩容:
在这里插入图片描述

empty():判断字符串是否为空串,空返回true ,不为空返回false

在这里插入图片描述
在这里插入图片描述

clear()清空有效字符

在这里插入图片描述

reserve()为字符串预留空间

在这里插入图片描述

1.主要作用:就是进行容量的预开辟,前提是知道需要多大的空间:
2.我们知道默认16(包含\0),设置当前容量为20,打印的结果是31是因为,底层需要对齐的操作。(除非设置好空间的大小值是满足对齐要求的否则实际的空间大小会比设置的大一点!)
3.我们发现reserve(在vs)不可以进行容量的减少只能进行容量的增加并且影响不到原来数据。
4.总结:只能进行扩容,不可以进行分段释放。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

1.主要作用:就是进行容量的预开辟,前提是知道需要多大的空间:
2.我们知道默认16(包含\0),设置当前容量为20,打印的结果是31是因为,底层需要对齐的操作。(除非设置好空间的大小值是满足对齐要求的否则实际的空间大小会比设置的大一点!)
3.我们发现reserve(sgl)可以进行容量的减少只要不去影响到原来的数据。
4.总结:只能进行扩容,不可以进行分段释放。

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

resize() 将有效字符改成n个并且多的使用字符C填充

在这里插入图片描述

1.resize 有两个重载:直接改变有效字符的个数用\0填充,\0不可见。
2.直接改变有效字符的个数用C填充。

1.有效字符变大:size_1 < n < capacity_1
2,进行尾插。
在这里插入图片描述

1.n<size()
尾删,删到剩n个数据,容量空间不会改变:
在这里插入图片描述

1.n>capacity_1
2.容量空间可以进行扩容
3.有效字符可以自己设置!
在这里插入图片描述

6.string 类对象的遍历:

6-1:通过重载的[]下标访问操作符:

在这里插入图片描述

基本使用:
在这里插入图片描述

循环遍历操作:
在这里插入图片描述
在这里插入图片描述
总结:通过重载的下标范围操作符是不可以进行内存空间的跳跃访问(比如链表:树:图:哈希等)的所以存在iteratoriterator迭代器实现遍历。

6-2:通过iterator迭代器实现遍历:

1.iterator 是一个类型(类似指针类型,指针指向对象的成员。)被类限定但是不被访问限定符限定:
2.通过类名+访问限定符进行访问。
3.类提供了方法去返回头尾指针(类似地址的东西)。

在这里插入图片描述
在这里插入图片描述

1.可读可写:
在这里插入图片描述

2.只读:
在这里插入图片描述

总结:返回的访问指针begin() end() 是满足左闭右开的!

6-3:通过string 的迭代器可以类比其他的容器的迭代器:

顺序表:
在这里插入图片描述
列表:
在这里插入图片描述

6-4:通过范围for实现遍历:

在这里插入图片描述

7.元素访问:

operator[]

在这里插入图片描述

at

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

总结:
1.operator[]的下标访问越界报错是直接报错误:
2.使用at 产生越界问题会只会去抛出异常可以进行异常捕获然后打印:

8.修改方面的方法:

append

在这里插入图片描述

1.append()重载了6个方法:
2.内容非常的冗余:完全没有必要;

operator+= 好处:

在这里插入图片描述

1.可以在当前字符串后面添加字符串:
2.可以在当前字符串后面添加一个直接写的 const char*
3.可以在当前字符串后面添加一个字符:

在这里插入图片描述

9.两个算法:

7-1:逆置算法:reverse()

在这里插入图片描述

字符串的逆置:
在这里插入图片描述

7-2:交换算法:

考虑使用迭代器和循环遍历实现一个逆置:
在这里插入图片描述

8:四个练习题:

8-1:把字符串转换成整数:

在这里插入图片描述
题目链接:

class Solution {
public:int StrToInt(string str){string::iterator it = str.end();int count = 1;int sum = 0;while (it != str.begin()){it--;char tmp = (*it);if (tmp >= 48 && tmp <= 57){sum += (((int)(tmp - '0')) * count);}else{if (it == str.begin()){if (tmp == '-'){sum *= -1;}else{break;}}else{sum = 0;break;}}count *= 10;}return sum;}
};

8-2:反转字符串:

在这里插入图片描述
题目链接

class Solution {
public:void reverseString(vector<char>& s) {reverse(s.begin(),s.end());vector<char>::iterator it = s.begin();while(it!=s.end()){cout<<*it;it++;}}
};

8-3:字符串中第一个唯一字符:

在这里插入图片描述
题目链接

1.定义一个26大小的数组去通过下标对应的方法记录每个字母出现的次数。
2.双for遍历,字符串和26这个数组。遍历字符串并且确定26数组中的值是不是1。
3.找到第一个只出现一次的数就返回:
4.时间复杂度为O(n)

class Solution {
public:int firstUniqChar(string s) {int arr[26] = { 0 };string::iterator it = s.begin();while (it != s.end()){int indx = (int)(*it - 97);arr[indx]++;it++;}string::iterator it1 = s.begin();int count = 0;while (it1 != s.end()){for (int i = 0; i < 26; i++){if (arr[(int)((*it1) - 97)] == 1){return count;}}count++;it1++;}return -1;}
};

8-4:字符串相加:

在这里插入图片描述

题目链接:

在这里插入图片描述

class Solution {
public:string addStrings(string num1, string num2){int end1 = num1.size()-1;int end2 = num2.size()-1; string s1;int indx=0;while(end1>=0 || end2>=0){int p1=0;int p2=0;//字符串转数值的操作:if(end1>=0){p1=(int)(num1[end1]-'0');}if(end2>=0){p2=(int)(num2[end2]-'0');}//记录和:int sum = p1+p2+indx;indx=sum/10;sum%=10;s1.push_back((sum+'0'));end1--;end2--;}if(indx>=1){s1.push_back((indx+'0'));}reverse(s1.begin(),s1.end());return s1;}
};

相关文章:

[C++]:8.C++ STL引入+string(介绍)

C STL引入string(介绍&#xff09; 一.STL引入&#xff1a;1.什么是STL2.什么是STL的版本&#xff1a;2-1&#xff1a;原始版本&#xff1a;2-2&#xff1a;P. J 版本&#xff1a;2-3&#xff1a;RW 版本&#xff1a;2-4&#xff1a;SGL版本&#xff1a; 3.STL 的六大组件&…...

C++基础从0到1入门编程(三)

系统学习C 方便自己日后复习&#xff0c;错误的地方希望积极指正 往期文章&#xff1a; C基础从0到1入门编程&#xff08;一&#xff09; C基础从0到1入门编程&#xff08;二&#xff09; 参考视频&#xff1a; 1.黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难 2.系统…...

[Jenkins] 物理机 安装 Jenkins

这里介绍Linux CentOS系统直接Yum 安装 Jenkins&#xff0c;不同系统之间类似&#xff0c;操作命令差异&#xff0c;如&#xff1a;Ubuntu用apt&#xff1b; 0、安装 Jenkins Jenkins是一个基于Java语言开发的持续构建工具平台&#xff0c;主要用于持续、自动的构建/测试你的软…...

设计模式 -- 适配器模式(Adapter Pattern)

适配器模式&#xff1a;属于结构型模式&#xff0c;结合了两个独立接口的功能&#xff0c;作为 两个不兼容的接口之间的桥梁 。 介绍 意图&#xff1a;将一个类的接口转换成客户希望的另外一个接口。适配器模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作。主要…...

Axios传值的几种方式

<body><script src"https://unpkg.com/axios/dist/axios.min.js"></script></body> axios基本使用 默认是get请求 注意&#xff1a;get请求无请求体&#xff0c;可以有body,但是不建议带 使用get方式进行无参请求 <script>axios(…...

git pull 报错 error object file is empty , The remote end hung up unexpectedly

报错原因分析&#xff1a;git pull的时候服务器在重启&#xff0c;导致git文件损坏 方法来源&#xff1a; 解决git错误: error object file is empty , The remote end hung up unexpectedly-CSDN博客 亲测有效 find .git/objects/ -type f -empty | xargs rm git fetch -p…...

手机数码类展示预约小程序效果如何

对于一家手机数码/电脑品牌来说&#xff0c;研发产品或衍生产品不少&#xff0c;通常会通过线上商城进行售卖。十年以来&#xff0c;流量成本逐渐增加&#xff0c;获客不易也难以寻找到合适的渠道&#xff0c;即使通过广告形式也因缺乏创意而耗时耗力&#xff0c;效果不佳。 同…...

图神经网络:消息传递算法

一、说明 图网络-GNN&#xff08;Graph Neural Networks&#xff09;是近几年研究的主题之一&#xff0c;虽不及深度神经网络那么火爆&#xff0c;但在一些领域&#xff0c;如分子化学方面是不得不依赖的理论。本文就一些典型意义的图神经网络消息传递展开阐述。 二、图网络简述…...

安全+Linux!IBM新一代大型机Z14全新发布

导读本周&#xff0c;以“架构 人机同行”为主题的IBM Systems创行者高峰论坛在北京召开&#xff0c;IBM全球及大中华区硬件系统部负责人&#xff0c;金融、医疗、制造等领域的企业、合作伙伴共与这一年度盛会&#xff0c;探讨认知时代下的基础架构技术趋势及IBM硬件系统业务的…...

Java中的局部变量和成员变量的区别

局部变量和成员变量的区别 区别1&#xff1a;代码中位置不同 成员变量&#xff1a;类中方法外定义的变量 局部变量&#xff1a;方法中定义的变量 代码块中定义的变量 区别2&#xff1a;代码的作用范围 成员变量&#xff1a;当前类的很多方法 局部变量&#xff1a;当前一…...

基于C++实现循环赛日程表(分治算法)

一、问题描叙 设有n2^k个运动员&#xff0c;要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他n-1个选手各赛一场每个选手一天只能赛一次循环赛一共进行n-1天 二、问题分析 按此要求可将比赛日程表设计成n行n-1列的表&#xff0c;在表中第 i 行…...

基于uni-app的汽车租赁app的设计与实现

1.项目背景及意义 项目背景&#xff1a; 随着人们生活水平的提高&#xff0c;汽车租赁服务在城市中变得越来越普及。传统的租车方式存在一些问题&#xff0c;比如租车流程繁琐、费用不透明、选择有限等。因此&#xff0c;开发一款基于uni-app的汽车租赁app成为了满足用户需求…...

3.8-镜像的发布

如果我们想将image push到docker hub里面&#xff0c;那么我们的image的名字一定要是这种格式&#xff1a;docker hub id/imageName&#xff0c;例如&#xff1a;lvdapiaoliang/hello-docker docker hub个人账户设置地址&#xff1a; 在push之前要先登录&#xff1a; docker l…...

Navicat 基于 GaussDB 主备版的快速入门

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…...

String的字符串拼接

java中 String a “123” “234”; String b “123”; String c b “234”; 其中a和c的区别是什么&#xff1f; a c 为什么为false 在Java中&#xff0c;字符串的处理特别是涉及到字符串常量和字符串变量的连接时&#xff0c;会涉及到字符串池&#xff08;String Pool&a…...

反渗透水处理成套设备有哪些

反渗透水处理成套设备主要包括反渗透装置、预处理系统、控制系统等部分。 反渗透装置&#xff1a;反渗透水处理设备的核心部分&#xff0c;由反渗透膜、压力容器、膜组件等组成。反渗透膜是一种高分子材料制成的半透膜&#xff0c;能够截留水中的溶解盐、有机物、细菌等杂质&a…...

DPC15 国产带有 SPI 接口的独立 CAN 控制器兼容替代MCP2551

DPC15是一款独立控制器局域网络&#xff08;Controller Area Network&#xff0c;CAN&#xff09;协议控制器&#xff0c;完全支持CAN V2.0B技术规范。该器件能发送和接收标准和扩展数据帧以及远程帧。 DPC15自带的两个验收屏蔽寄存器和六个验收滤波寄存器可以过滤掉不想要的报…...

【ELK01】ELK简介以及ElasticSearch安装、ES客户端工具-Head安装、报错问题整理

有一段时间没有更新这个专栏了,最近在用ELK相关的技术,今天开始写一下ELK的系列的内容,与大家共同学习 一、什么是ELK ELK 是elastic公司提供的一套完整的日志收集以及展示的解决方案,是三个产品的首字母缩写,分别是ElasticSearch、Logstash 和 Kibana。 1. E-ELASTICS…...

根据音频绘制频谱

根据音频链接绘制频谱图 封装 // 可以这样使用 也可以 import { AudioContext } from standardized-audio-context; const getAudioContext window.AudioContext ||window.webkitAudioContext ||window.mozAudioContext ||window.msAudioContext;const clearArr []export c…...

SSL证书对网站SEO的好处

随着网络安全意识的提高&#xff0c;越来越多的网站开始采用SSL证书来保护自己的数据传输过程。那么&#xff0c;SSL证书真的能为网站SEO带来好处吗&#xff1f;下面将为您分析这个问题。 加强用户体验和信任度 SSL证书不仅能确保数据传输的安全性&#xff0c;还能让客户感受…...

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...

3.3.1_1 检错编码(奇偶校验码)

从这节课开始&#xff0c;我们会探讨数据链路层的差错控制功能&#xff0c;差错控制功能的主要目标是要发现并且解决一个帧内部的位错误&#xff0c;我们需要使用特殊的编码技术去发现帧内部的位错误&#xff0c;当我们发现位错误之后&#xff0c;通常来说有两种解决方案。第一…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

Swagger和OpenApi的前世今生

Swagger与OpenAPI的关系演进是API标准化进程中的重要篇章&#xff0c;二者共同塑造了现代RESTful API的开发范式。 本期就扒一扒其技术演进的关键节点与核心逻辑&#xff1a; &#x1f504; 一、起源与初创期&#xff1a;Swagger的诞生&#xff08;2010-2014&#xff09; 核心…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

【分享】推荐一些办公小工具

1、PDF 在线转换 https://smallpdf.com/cn/pdf-tools 推荐理由&#xff1a;大部分的转换软件需要收费&#xff0c;要么功能不齐全&#xff0c;而开会员又用不了几次浪费钱&#xff0c;借用别人的又不安全。 这个网站它不需要登录或下载安装。而且提供的免费功能就能满足日常…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...