[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/…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

破解tomcat密码并上传webshell

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

Skywalking流程分析_8(拦截器插件的加载)

前言 在之前的文章中我们将&#xff0c;静态方法、构造方法、实例方法的增强逻辑都分析完毕&#xff0c;但在增强前&#xff0c;对于拦截类的加载是至关重要的&#xff0c;下面我们就来详细的分析 增强插件的加载 静态方法增强前的加载 //clazz 要修改的字节码的原生类 Sta…

实用篇-ES-RestClient查询文档

一、快速入门 上面的查询文档都是依赖kibana&#xff0c;在浏览器页面使用DSL语句去查询es&#xff0c;如何用java去查询es里面的文档(数据)呢 我们通过match_all查询来演示基本的API&#xff0c;注意下面演示的是 match_all查询&#xff0c;也叫基础查询 首先保证你已经做好了…

【flutter】使用getx下的GetMaterialApp创建路由和使用时间选择器国际化问题

GetMaterialApp是啥 网上解释说是 MaterialApp Getx properties GetMaterialApp 问题 在使用showDateRangePicker组件的时候&#xff0c; 一直报错 No MaterialLocalizations found 我就愁思是不是GetMaterialApp跟MaterialApp方法不一样的问题&#xff0c;结果不是&#…

java初探之代理模式

代理模式 代理模式一般有三种角色&#xff1a; 没有使用代理模式的话可能就会直接去操作真实的对象 加入代理模式就是加入了 隔离 把我们的真实对象与调用者隔离了一下(代理对象) 代理对象的好处&#xff1f; 使用者(client)跟真实的对象是没有直接的交集的。不会直接操作到…

国内crm解决方案的主要提供商有哪些?对比7家

目前国内CRM服务商1410家&#xff0c;今年1-7月CRM服务商新注册19家。如何从众多服务商中挑选出合适的一家&#xff0c;无疑是一项耗时耗力的大工程。为此&#xff0c;本文将为根据国内外知名机构、媒体、网站发布、百度指数、行业知名度等维度考量&#xff0c;选择出7大CRM系统…

【Proteus仿真】【51单片机】锂电池管理系统

文章目录 一、功能简介二、软件设计三、实验现象联系作者 一、功能简介 本项目使用Proteus8仿真51单片机控制器&#xff0c;使用LCD1602显示模块、DS18B20温度传感器、PCF8691 ADC模块、按键、LED蜂鸣器模块等。 主要功能&#xff1a; 系统运行后&#xff0c;LCD1602显示温度…

MFC保存窗口客户区为图片

首先的窗口输出一些内容&#xff1b; 菜单单击函数代码&#xff1b; void CgetmypicView::OnTestGetmypic() {// TODO: 在此添加命令处理程序代码HWND hwnd this->GetSafeHwnd();HDC hDC ::GetWindowDC(hwnd);//获取DC RECT rect;::GetClientRect(hwnd, &rect)…

C/C++输出整数部分 2021年12月电子学会青少年软件编程(C/C++)等级考试一级真题答案解析

目录 C/C输出整数部分 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序编写 四、程序说明 五、运行结果 六、考点分析 C/C输出整数部分 2021年12月 C/C编程等级考试一级编程题 一、题目要求 1、编程实现 输入一个双精度浮点数f&#xff0c; 输出其整…

【918.环形子数组的最大和】

目录 一、题目描述二、算法原理三、代码实现 一、题目描述 二、算法原理 三、代码实现 class Solution { public:int maxSubarraySumCircular(vector<int>& nums) {int sum0;for(auto x:nums) sumx;vector<int> f(nums.size());vector<int> g(nums.size…