探索C++标准模板库(STL):从容器到底层奥秘-全面解析String类高效技巧(上篇)

前引:在现代软件开发中,字符串处理是几乎所有程序的核心需求之一。无论是文本解析、网络通信,还是用户交互,高效且安全的字符串操作能力直接决定了代码的质量与可维护性。而C++标准模板库(Standard Template Library, STL)中的 string 类,正是为这一需求而生——它既封装了底层字符数组的复杂性,又通过统一的接口提供了丰富的操作功能,成为C++开发者最常用的工具之一! 

【string其实并没那么难!简单来说就是学习各种功能接口,希望此文对佬有所帮助,加油丫!】 

目录

STL介绍

STL核心模块

为什么要学习String

String的使用规则

String的常用接口

构造函数

构造空对象

构造字符对象

拷贝构造

构造指定字符数量的对象

成员函数

尾插一个字符

尾插一个字符串

输入运算符重载

输出运算符重载

获取一行字符串

关系操作/比较

获取pos位置的字符

计算有效字符长度

清楚有效字符

检测字符串是否为空串

指定调整空间

指定调整空间+初始化

指定位置插入数据

指定位置删除数据

标记获取区间数据

迭代器访问

迭代器顺序获取字符

迭代器逆序获取字符

迭代器在函数中顺序获取字符

迭代器在函数中逆序获取字符


STL介绍

STL(standard template libaray-标准模板库):是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架

String 是C++标准库中定义的字符串类的容器,属于<string>头文件,通过封装底层字符数字的复杂性,提供了一套安全、高效且易扩展的字符串操作接口

STL核心模块

STL包含三大核心模块:

(1)容器(比如 string、vextor、list、map、set........)

(2)算法(比如排序、查找、遍历.......)

(3)迭代器:类似指针(可能是指针,可能不是)的抽象工具,提供对容器元素的统一访问方式

为什么要学习String

首先比较直接的在笔试中对STL知识的运用很广泛,例如:

https://www.nowcoder.com/share/jump/1747468021126

其次在面试中对STL相关知识也考的比较多,例如:

对于C++程序员、面试者、工程师掌握STL都将显著提高我们的代码质量与开发体验~ 

String的使用规则

(1)string是表示字符串的字符串类

(2) 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。

(3)string在底层实际是:basic_string模板类的别名,typedef basic_string string;

(4)不能操作多字节或者变长字符的序列。 在使用string类时,必须包含#include头文件以及                 using namespace std(或者范围展开使用)

String的常用接口

构造函数

对于构造函数的功能,小编在之前已经出过文章仔细学习了,大家可以翻小编C++专栏笔记哦!

大家可以打开这个网站,里面详细介绍了容器里面的各种接口使用!主页搜索:string

https://legacy.cplusplus.com/

(1)先包含#include<string>头文件

(2)全局展开/范围展开C++标准库

构造空对象

参数:

形式:string ()

例如:

string S1;

构造字符对象

参数:字符串

形式:string string对象(const char* s)

例如:

string S2("hello word");

拷贝构造

参数:一个存在的string对象

形式:string string对象(string对象)

例如:

string S3(S2);

构造指定字符数量的对象

参数:字符串、字符个数(有效个数)

形式:string string对象(const char * s,size_t)

例如:

string S4("how are you", 7);

 如果超过当前字符串个数,后面将是随机值,例如:

成员函数
尾插/尾删一个字符

参数:字符

形式:string对象 . push_back(char c)

           (自动扩容)

尾删:pop_back

例如:

S2.push_back('*');

尾插一个字符串

参数:字符串

形式:string对象 . append(const char* s)

           自动扩容

例如:

S2.append("WWWWWW");

输入运算符重载

参数:string 对象

形式:operator >> string对象

例如:

cin>>S2;

如果字符串中有空格,会作为结束的标志,例如:

输出运算符重载

参数:string对象

形式:cout << string对象

例如:

cout << S2

获取一行字符串

参数:输入运算符重载,string对象

形式:getline(cin,string对象)

例如:

其实就是升级版的“输入运算符重载”,会获取当前字符串的所有内容

getline(cin,S2);

关系操作/比较

参数:string对象,string对象
形式:string对象  关系符  string对象

例如:

S2 == S3;
S2 < S3;
S2 > S3;
S2 + S3;
S2 += S3;
S2 = S3; 

获取pos位置的字符

参数:字符串对象的位置下标(跟操作数组一样)

形式:string对象  [下标]

例如:

S2[i]

 它是可以直接修改内容的,例如:

如果换成 auto 自动推导类型也是可以的(需要用引用),因为 auto 底层是迭代器,例如:

计算有效字符长度

形式:string对象.size()

例如:

S2.size()

清楚有效字符

形式:string对象.clear()

例如:

S2.clear()

检测字符串是否为空串

形式:string对象.empty()   (是则返回true,否则返回false)

例如:

S2.empty()

指定调整空间

形式:string对象.reserve(size_t) 

           扩容的大小只大于等于指定大小,不可能小于指定大小

          如果第二次调整的空间小于第一次调整的空间,容量不会减少

例如:

S2.reserve(10)

reserve调容量规则:

如果预调容量之后会影响到原来已经存储的数据,则不会调小容量,例如:

 如果预调容量之后不影响到原来已经存储的数据,则会调小容量,例如:

指定调整空间+初始化

形式:  string对象.resize(size_t)

             string对象.resize(size_t,char c)

           如果 size_t 大于当前字符串长度,则将剩余的字符初始化为指定的内容,否则转为空格

           如果 size_t 小于当前字符串长度,则缩短为其前 n 个字符,并删除超出第 n 个字符的字符

例如:

S2.resize(10);S2.resize(5,'*')S2.resize(12,'*')

调整规则:

如果给resize的值小于当前空间容量,resize不会去缩小容量,只会删除数据,例如:

指定位置插入数据

形式:string对象.insert(size_t,const char c)          指定位置插入指定字符串

形式:string对象.insert(size_t,size_t,char c)         指定位置插入指定数量的字符

例如:

注意:指定的位置受当前容量的影响

S2.insert(5,"hao are you");S2.insert(10,5,'x');

指定位置删除数据

形式:string对象.erase(size_t)      删除指定位置之后的所有数据

           string对象.erase(size_t,size_t)         删除指定位置开始的一定数量的数据

例如:

S2.erase(5);S2.erase(0,1);

标记获取区间数据

这里通常是将两个成员函数:find+substr 结合起来用

find:标记一个字符/字符串/string对象,在对象中从头开始寻找标记地方,没有找到就返回 npos

substr:给一个区间,可以只写开始的位置,返回拷贝这个区间的新对象

例如:

用 find 标记一个初始位置,如果找到这个标记的地方,substr 根据区间拷贝构造一个新对象

判断一个字符是不是字母

形式:isalpha(char c)

           c是字母返回非0,否则返回0

例如: 

 判断一个字符是不是字符数字

形式:isdigit(char c)

          返回0表示不是数字,非0表示是字符数字

例如:

 大小写字符的相互转化

形式:toupper(char c)tolower(char c)

    小转大        大转小

例如:

删除指定字符

形式:erase(remove(str.begin(), str.end(), ch), str.end())

例如:

逆置字符串

形式:reverse(string对象.begin()  , string对象.end())

例如: 

整型数字转字符串

形式:string对象 = to_string(数字)

例如:

迭代器访问

迭代器:

一种设计模式,用于遍历集合中的元素,而无需暴露集合的内部结构。它提供了一种统一的方式来访问集合中的元素,无论集合的具体实现是什么(想象为一种访问工具)

优势:

迭代器(iterator)提供一种统一的方式访问和修改容器的数据(需要注意在函数中的使用只能访问,且在指定位置加上 const ,否则会报错)

因此算法就可以通过迭代器,去处理容器中的数据 

迭代器顺序获取字符

如图:

形式:

迭代器逆序获取字符

图示:

例如:

迭代器在函数中顺序获取字符

使用:在迭代器前面加上 const 修饰,只能访问不能修改数据

例如:

迭代器在函数中逆序获取字符

使用:在迭代器前面加上 const_ 修饰,只能访问不能修改数据

例如:

                                                  【雾非雾】期待与你的下次相遇!

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

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

相关文章

Python爬虫实战:抓取百度15天天气预报数据

&#x1f310; 编程基础第一期《9-30》–使用python中的第三方模块requests&#xff0c;和三个内置模块(re、json、pprint)&#xff0c;实现百度地图的近15天天气信息抓取 记得安装 pip install requests&#x1f4d1; 项目介绍 网络爬虫是Python最受欢迎的应用场景之一&…

HTML常见事件详解:从入门到实战应用

前言 在Web开发中&#xff0c;事件是用户与网页交互的核心机制。HTML事件让我们能够响应用户的各种操作&#xff0c;如点击、鼠标移动、键盘输入等。掌握HTML事件是前端开发的基础技能之一&#xff0c;本文将深入探讨HTML中的常见事件类型及其实际应用。 HTML事件概览总结 H…

模具制造业数字化转型:精密模塑,以数字之力铸就制造基石

模具被誉为 “工业之母”&#xff0c;是制造业的重要基石&#xff0c;其精度直接决定了工业产品的质量与性能。在工业制造向高精度、智能化发展的当下&#xff0c;《模具制造业数字化转型&#xff1a;精密模塑&#xff0c;以数字之力铸就制造基石》这一主题&#xff0c;精准点明…

深度解读漏洞扫描:原理、类型与应用实践

在网络安全领域&#xff0c;漏洞就像隐藏在系统中的定时炸弹&#xff0c;随时可能被攻击者利用&#xff0c;导致数据泄露、服务瘫痪等严重后果。而漏洞扫描作为发现这些潜在威胁的 “侦察兵”&#xff0c;是保障网络安全的重要防线。本文将全面介绍漏洞扫描的相关知识&#xff…

[HNCTF 2022 Week1]silly_zip

下载附件 解压发现需要密码 用010打开看看&#xff0c;发现是伪加密 改成00点击保存 解压后得到图片 感觉图片看着怪怪的&#xff0c;修改一下高度看看有没有其他线索 把47改成78 最后得到flag

Facebook 的隐私保护措施是否足够?技术观点

在数字时代&#xff0c;隐私保护成为了公众关注的焦点&#xff0c;尤其是对于拥有数十亿用户的社交媒体巨头 Facebook 来说&#xff0c;其隐私保护措施的有效性更是备受瞩目。本文将从技术角度探讨 Facebook 的隐私保护措施是否足够。 数据收集与使用 Facebook 收集用户数据的…

cocosCreator 1.8 升级到 2.4

现在负责的一个运营中的商业项目&#xff0c;使用的是 cocosCreator1.8&#xff0c;之前没有做好设计&#xff0c;所以东西都是直接加载在内存中的&#xff0c;到了现在性能问题逐渐暴露出来&#xff0c;讨论之后想进行引擎升级&#xff0c;升级到cocosCreator 2.4。 官方的升…

ubuntu 制作 ssl 证书

安装 openssl sudo apt install openssl 生成 SSL 证书 # 生成私钥 (Private Key) openssl genrsa -out private.key 2048 在当前目录生成 private.key # 生成证书签名请求 (CSR - Certificate Signing Request) openssl req -new -key private.key -out certificate.csr -…

【Java基础-环境搭建-创建项目】IntelliJ IDEA创建Java项目的详细步骤

在Java开发的世界里&#xff0c;选择一个强大的集成开发环境&#xff08;IDE&#xff09;是迈向高效编程的第一步。而IntelliJ IDEA无疑是Java开发者中最受欢迎的选择之一。它以其强大的功能、智能的代码辅助和简洁的用户界面&#xff0c;帮助无数开发者快速构建和部署Java项目…

WEB3——什么是ABI

怎么获得ABI&#xff1f; 在编译完合约后&#xff0c;可以在左边下面点击复制ABI ABI&#xff08;Application Binary Interface&#xff0c;应用二进制接口&#xff09;是用来让前端或服务端 JavaScript 代码与智能合约进行交互的桥梁&#xff0c;它描述了合约的函数、事件和…

移动安全Android——客户端数据安全

本地文件权限配置 测试流程 &#xff08;1&#xff09;手机运行待测APP应用&#xff0c;adb执行命令找到APP包名 adb shell dumpsys activity top|findstr ACTIVITY &#xff08;2&#xff09;adb shell 进入设备&#xff0c;以Root权限进入/data/data/package包名目录下 c…

拉普拉斯噪声

1. 概念 拉普拉斯噪声是一种连续概率分布生成的随机噪声&#xff0c;其核心特点是符合拉普拉斯分布。这种噪声被特意添加到数据&#xff08;尤其是查询结果或统计量&#xff09;中&#xff0c;以实现差分隐私这一严格的隐私保护框架。 核心目的&#xff1a; 在保护数据集中的个…

django项目开启debug页面操作有数据操作记录

在项目的主文件中setting中配置 """ Django settings for ProjectPrictice project.Generated by django-admin startproject using Django 3.0.1.For more information on this file, see https://docs.djangoproject.com/en/3.0/topics/settings/For the ful…

【科研绘图系列】R语言绘制森林图(forest plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据数据预处理画图系统信息介绍 本文介绍使用R语言绘制森林图(forest plot)的方法。首先加载必要的R包(grid、forestploter、openxlsx、stringr),导入并预处…

MySQL-8.0.42 主从延迟常见原因及解决方法

目录 1 查看从库延时方法 2 如何分析主从延迟 3 主从延迟的常见原因及解决方法 1 查看从库延时方法 mysql> show slave status \G *************************** 1. row *************************** Slave_IO_Running: Yes #两个yes说明主从复制正常 …

Kotlin 活动事件通讯跳转深度讲解

在 Android 开发的浩瀚海洋中,活动(Activity)间的事件通讯与跳转犹如构建复杂应用程序的桥梁与纽带,而 Kotlin 语言的加入,更是为这一过程注入了简洁、优雅与高效的活力。本文将深入剖析 Kotlin 开发中安卓活动事件通讯跳转的方方面面,从基础概念到高级技巧,从代码示例到…

[FreeRTOS- 野火] - - - 临界段

一、介绍 临界段最常出现在对一些全局变量进行操作的场景。 1.1 临界段的定义 临界段是指在多任务系统中&#xff0c;一段需要独占访问共享资源的代码。在这段代码执行期间&#xff0c;必须确保没有任何其他任务或中断可以访问或修改相同的共享资源。 临界段的主要目的是防…

Vad-R1:通过从感知到认知的思维链进行视频异常推理

文章目录 速览摘要1 引言2 相关工作视频异常检测与数据集视频多模态大语言模型具备推理能力的多模态大语言模型 3 方法&#xff1a;Vad-R13.1 从感知到认知的思维链&#xff08;Perception-to-Cognition Chain-of-Thought&#xff09;3.2 数据集&#xff1a;Vad-Reasoning3.3 A…

CSS Day07

1.搭建项目目录 2.网页头部SEO三大标签 3.Favicon图标与版心 &#xff08;1&#xff09;Favicon图标 &#xff08;2&#xff09;版心 4.快捷导航 5.头部-布局 6.头部-logo 7.头部-导航 8.头部-搜索 9头部-购物车 10.底部-布局 11.底部-服务区域 12.底部-帮助中心 13.底部-版权…

Flutter图片Image、本地图片、程程图片、圆片剪切、圆形图片

目录 图片组件的介绍 1.Image.network加载图片 1.1 Image scale图片缩小一倍 1.2 Image alignment使用 1.3 Image fit 属性的取值及说明 1.3.1 Contain 默认效果 1.3.2 Fill 图片会缩放至完全填满目标区域&#xff08;宽高&#xff09; 1.3.3 Fill 图片会缩放至完全填满目…