[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() :返回字符串有效字符串长度数
      • capacity():返回空间总大小:
      • empty():判断字符串是否为空串,空返回true ,不为空返回false
      • clear()清空有效字符
      • reserve()为字符串预留空间
      • resize() 将有效字符改成n个并且多的使用字符C填充
    • 6.string 类对象的遍历:
      • 6-1:通过重载的[]下标访问操作符:
      • 6-2:通过iterator迭代器实现遍历:
      • 6-3:通过string 的迭代器可以类比其他的容器的迭代器:
      • 6-4:通过范围for实现遍历:
    • 7.两个算法:
      • 7-1:逆置算法:reverse()
      • 7-2:交换算法:
    • 8:三个练习题:
      • 8-1:把字符串转换成整数:
      • 8-2:反转字符串:
      • 8-3:字符串中第一个唯一字符:

一.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:下面内容后面会补充

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

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

clear()清空有效字符

reserve()为字符串预留空间

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

6.string 类对象的遍历:

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

在这里插入图片描述

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

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

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

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

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

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

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

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

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

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

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

在这里插入图片描述

7.两个算法:

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:字符串中第一个唯一字符:

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

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;}
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/145074.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为React Ant-Design Table增加字段设置 | 京东云技术团队

最近做的几个项目经常遇到这样的需求&#xff0c;要在表格上增加一个自定义表格字段设置的功能。就是用户可以自己控制那些列需要展示。 在几个项目里都实现了一遍&#xff0c;每个项目的需求又都有点儿不一样&#xff0c;迭代了很多版&#xff0c;所以抽时间把这个功能封装了…

【Electron】electron-builder打包失败问题记录

文章目录 yarn下载的包不支持require()winCodeSign-2.6.0.7z下载失败nsis-3.0.4.1.7z下载失败待补充... yarn下载的包不支持require() 报错内容&#xff1a; var stringWidth require(string-width)^ Error [ERR_REQUIRE_ESM]: require() of ES Module /stuff/node_modules/…

12 Go的接口

概述 在上一节的内容中&#xff0c;我们介绍了Go的作用域&#xff0c;包括&#xff1a;局部作用域、全局作用域、命名空间作用域等。在本节中&#xff0c;我们将介绍Go的接口。Go语言中的接口是一种类型&#xff0c;它定义了一组函数的集合。接口是一种抽象的描述&#xff0c;它…

一文浅入Springboot+mybatis-plus+actuator+Prometheus+Grafana+Swagger2.9.2开发运维一体化

Swagger是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTFUL风格的Web服务,是非常流行的API表达工具。 Swagger能够自动生成完善的 RESTFUL AP文档,,同时并根据后台代码的修改同步更新,同时提供完整的测试页面来调试API。 Prometheus 是一个开源的服务监控系统和时…

葡萄酒质量预测python

葡萄酒质量预测是一个经典的机器学习问题&#xff0c;通常使用基于统计模型的机器学习方法来解决。在Python中&#xff0c;我们可以使用各种机器学习库&#xff0c;如scikit-learn&#xff0c;来构建和训练模型。 以下是一个简单的示例&#xff0c;展示如何使用scikit-learn库…

设计模式解码:软件工程架构的航标

引言 软件工程领域的设计模式&#xff0c;就像是建筑师手中的设计蓝图&#xff0c;它们是经验的总结&#xff0c;指导开发者如何在面对层出不穷的编程难题时&#xff0c;构建出既稳固又灵活的软件结构。就像一座经过精心设计的大厦能够经受住风雨的考验一样&#xff0c;一个利用…

基础框架代码解释

自定义的&#xff0c;用法就是等于号后面的 out是自己定义的层啊 nn.ReLU()是构造了一个ReLU对象&#xff0c;并不是函数调用&#xff0c;而F.ReLU()是函数调用 这里大佬能说一下&#xff0c;为什么forward里面不能用nn.RELU()函数吗&#xff0c;我只知道是因为参数的问题&a…

智慧城市怎么实时监测内涝积水的发生及解决办法?

随着城市化进程步伐不断加快&#xff0c;城市内涝问题越来越受到人们的关注。内涝不仅不便于人们的生活&#xff0c;还可能危害城市之中的基础设施比如路面等。因此实时监测内涝积水的发生并采取有效的解决办法是市政府的紧急任务&#xff0c;同时解决城市内涝也利于城市生命线…

OpenCV中的像素重映射原理及实战分析

引言 映射是个数学术语&#xff0c;指两个元素的集之间元素相互“对应”的关系&#xff0c;为名词。映射&#xff0c;或者射影&#xff0c;在数学及相关的领域经常等同于函数。 基于此&#xff0c;部分映射就相当于部分函数&#xff0c;而完全映射相当于完全函数。 说的简单点…

【算法】算法题-20231117

这里写目录标题 一、搜索插入位置&#xff08;35&#xff09;二、字符串相乘&#xff08;43&#xff09;三、两个相同字符之间的最长子字符串&#xff08;1624&#xff09;四、给你一个 有效括号字符串 s&#xff0c;返回该字符串的 s 嵌套深度 一、搜索插入位置&#xff08;35…

linux高级篇基础理论二(详细文档、LAMP、SHELL、sed正则表达式)

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a; 小刘主页 ♥️不能因为人生的道路坎坷,就使自己的身躯变得弯曲;不能因为生活的历程漫长,就使求索的 脚步迟缓。 ♥️学习两年总结出的运维经验&#xff0c;以及思科模拟器全套网络实验教程。专栏&#xff1a;云计算技…

C#委托与事件

在C#中&#xff0c;委托&#xff08;Delegates&#xff09;和事件&#xff08;Events&#xff09;是用于实现事件驱动编程的关键组件。 委托&#xff08;Delegates&#xff09; 委托是一种特殊的类型&#xff0c;它定义了方法的签名&#xff08;即方法的返回类型和参数类型&a…

layui的layer.confirm获取按钮焦点

因为ayer.confirm的按钮并非采用button&#xff0c;而是a标签&#xff0c;所以获取按钮焦点获取不到&#xff0c;要采用别的方法&#xff0c;下面介绍在ie11中和ie8中不同的写法 在ie11中 layer.confirm(确定取消这个弹窗吗&#xff1f;,{btn: [确定, 取消],success:function…

海康Visionmaster-环境配置:VB.Net 二次开发环境配 置方法

Visual Basic 进行 VM 二次开发的环境配置分为三步。 第一步&#xff0c;使用 VS 新建一个框架为.NET Framework 4.6.1&#xff0c;平台去勾选首选 32 为的工程&#xff0c;重新生成解决方案&#xff0c;保证工程 Debug 下存在 exe 文件&#xff0c;最后关闭新建工程&#xff1…

按键精灵中的日志、分辨率、找色逻辑、线程

1. 开启输出日志 // 开启日志 Log.Open TracePrint "你好"TracePrint "世界"// 关闭日志 Log.Close // 输出日志 TracePrint GetTempDir()// 当前脚本第4行&#xff1a;你好 // 当前脚本第6行&#xff1a;世界2. 设置分辨率 在写脚本的时候&#xff0c…

【MATLAB源码-第79期】基于蚯蚓优化算法(EOA)的栅格路径规划,输出做短路径图和适应度曲线。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 蚯蚓优化算法&#xff08;Earthworm Optimisation Algorithm, EOA&#xff09;是一种启发式算法&#xff0c;灵感来源于蚯蚓在自然界中的行为模式。蚯蚓优化算法主要模仿了蚯蚓在寻找食物和逃避天敌时的行为策略。以下是蚯蚓…

【Android】使用XML资源文件存储配置项:降低代码耦合性并提高可重用性

前言 在Android开发中&#xff0c;我们经常需要存储一些配置项。 例如在创建Retrofit实例时&#xff0c;需要指定baseUrl。如果需要修改替换整个项目中的baseUrl&#xff0c;那将会是一件很痛苦的事情。 为了方便管理和维护这些配置项&#xff0c;我们可以使用资源文件来存储…

ubuntu 无法获得锁的解决

在输入sudo apt-get update后发现终端提示&#xff1a; E: 无法获得锁 /var/lib/dpkg/lock-frontend - open (11: 资源暂时不可用) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? 解决方案一&#xff1a; 先找…

【Kingbase FlySync】命令行:同步软件安装部署,并实现KES到KES实现同步迁移

概述 Kingbase FlySync是面向同城/异地灾备、数据库平滑升级替换、数据集中共享与分发、应用上云迁移、数据库负载均衡等场景的数据同步产品。该产品基于增量日志解析技术&#xff0c;性能高、时延低、资源占用极少&#xff0c;能够实现异构数据源之间大规模增量数据的任意方向…

破解tomcat密码并上传webshell

tomcat基础认证爆破 暴力破解 进入vulnhub的tomcat8目录&#xff0c;启动环境 由于tomcat密码默认最大尝试错误次数为5次&#xff0c;需要修改server.xml&#xff0c;修改下面字段 failureCount"10000000000" lockOutTime"0"tomcat默认界面&#xff0c;…