【C++】string类的深入介绍

news2024/10/5 17:24:35

【C++】string类的深入介绍(1)

目录

  • 【C++】string类的深入介绍(1)
      • 标准库中的string类
          • string类(了解即可)
          • string类的常用接口说明(最常用的)
          • 详细介绍string::operator[]
      • 迭代器
          • string中的迭代器(任何容器都支持,用法都是类似的)
          • string中的反向迭代器
          • begin()、end()以及rbegin()、rend()具体指向的位置
      • const迭代器
      • string中的Capacity
            • **max_size**
            • **capacity**
            • **clear**(清理空间但**并不释放空间**)
            • **reserve**(提前给string开空间)
            • **resize** 不单单扩容,而是**开空间加初始化**(不给初始化值默认/0)

作者:爱写代码的刚子
时间:2023.5.26
本篇博客主要深入介绍string类、string类的常用接口及操作,string中迭代器的使用,以及string中的部分方法。(由于篇幅有限,剩余方法以及string的深浅拷贝将在之后的博客介绍)
前言:C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。

C++参考网站:

C++参考
C++官网
如果方便地查找网页中的关键字可以使用ctrl + f进行搜索
以C++参考网站为例,演示查找string类:
在这里插入图片描述

标准库中的string类

string类(了解即可)
  1. 字符串是表示字符序列的类
  2. 标准的字符串类提供了对此类对象的支持,其接口类似于标准字符容器的接口,但添加了专门用于操作
    单字节字符字符串的设计特性。
  3. string类是使用char(即作为它的字符类型,使用它的默认char_traits和分配器类型(关于模板的更多信
    息,请参阅basic_string)。
  4. string类是basic_string模板类的一个实例,它使用char来实例化basic_string模板类,并用char_traits
    和allocator作为basic_string的默认参数(根于更多的模板信息请参考basic_string)。
  5. 注意,这个类独立于所使用的编码来处理字节:如果用来处理多字节或变长字符(如UTF-8)的序列,这个类的所有成员(如长度或大小)以及它的迭代器,将仍然按照字节(而不是实际编码的字符)来操作。

总结:

  1. string是表示字符串的字符串类
  2. 该类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
  3. string在底层实际是:basic_string模板类的别名,typedef basic_string<char, char_traits, allocator> string;
  4. 不能操作多字节或者变长字符的序列。
  • 在使用string类时,必须包含#include头文件以及using namespace std;
string类的常用接口说明(最常用的)

学会查文档对C++的学习是非常重要的!(以下使用参考网站为例):
在这里插入图片描述
这里只列举的部分,大家学习的时候一定要学会查文档!

  • string类对象的常见构造
(constructor)函数名称功能说明
string()(重点)构造空的string类对象,即空字符串
string(const char* s)(重点)用C-string来构造string类对象
string(size_t n,char c)string类对象中包含n个字符c
string(const string&s)(重点)拷贝构造函数
  • string类对象的容量操作
函数名称功能说明
size(重点)返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty(重点)检测字符串释放为空串,是返回true,否则返回false
clear(重点)清空有效字符
reserve(重点)为字符串预留空间
resize(重点)将有效字符的个数改成n个,多出的空间用字符c填充

注意:

  1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一
    致,一般情况下基本都是用size()
  2. clear()只是将string中有效字符清空,不改变底层空间大小。
  3. resize(size_t n) 与 resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,不同的是当字符个数增多时:resize(n)用0来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。注意:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。
  4. reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于
    string的底层空间总大小时,reserver不会改变容量大小。
  • string类对象的访问及遍历操作
函数名称功能说明
operator(重点)返回pos位置的字符,const string类对象调用
begin + endbegin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rendrbegin返回一个逆向迭代器,指向字符串的最后一个字符+rend返回一个逆向迭代器,指向字符串的开头(第一个字符的前一个位置)。
范围forC++11支持更简洁的范围for的新遍历方式
  • string类对象的修改操作
函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+=(重点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

注意:

  1. 在string尾部追加字符时,s.push_back© / s.append(1, c) / s += 'c’三种的实现方式差不多,一般情况下string类的+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
  2. 对string操作时,如果能够大概预估到放多少字符,可以先通过reserve把空间预留好。
  • string类非成员函数
函数功能说明
operator+尽量少用,因为传值返回,导致深拷贝效率低
operator>>(重点)输入运算符重载
operator<<(重点)输出运算符重载
getline(重点)获取一行字符串
relational operators(重点)大小比较

在这里插入图片描述

  • 需要注意的一个小点:
    在对string类使用<<的运算符重载进行比较时,我们一定要注意==<<的优先级较高(相较于普通的运算符)==,所有我们进行比较时要带上括号!
    在这里插入图片描述

  • 正确使用:
    在这里插入图片描述

    • npos静态变量的介绍:

在这里插入图片描述
npos不是-1,而是整形的最大值(因为npos是无符号整型)
在这里插入图片描述

  • 其他一些重要的修饰符和字符串操作:
    在这里插入图片描述
    append(追加字符串)以及push_back(尾插一个字符)等一些函数已经实现了自动扩容(C++的好处,本质是字符管理的顺序表),但是建议使用 += ,因为 += 重载了这两种方法(例:string str;str += ('0' + val);(直接将整型val转成字符串))
    注意有些情况+=不能替代append
    下面是append具体信息:
    在这里插入图片描述

具体用法查文档即可

详细介绍string::operator[]

示例:
在这里插入图片描述

上述代码中str和a虽然都是字符串,但是str的实现逻辑是调用string::operator,而a的实现逻辑是*(a+1);(在clion编译器中编译器跳过了第9行的a[1];语句,没有执行(编译器的优化))

迭代器

string中的迭代器(任何容器都支持,用法都是类似的)

示例:
在这里插入图片描述

  • iterator是像指针一样的类型,有可能是指针,有可能不是指针(封装的指针)。(其实iterator的底层是用指针来实现的)
  • 范围for(底层替换为迭代器,可以查看反汇编代码,一个类支持迭代器就支持范围for)
    在这里插入图片描述

以上代码中若要进行对str2的修改可以使用引用:
在这里插入图片描述

  • 链表中使用迭代器
    在这里插入图片描述
    iterator提供了一种统一的方式,访问和修改容器的数据。算法通过迭代器去处理容器中的数据
  • 迭代器可以和容器进行配合
    以reverse函数举例:
    在这里插入图片描述
    由于reverse提供了list模版,所以可以对链表实现逆置。
    当然,也可以使用范围for来替代迭代器:
    在这里插入图片描述
string中的反向迭代器

在这里插入图片描述
而范围for不能反向遍历

begin()、end()以及rbegin()、rend()具体指向的位置

如下图所示
在这里插入图片描述

const迭代器

注意auto在自动识别类型时并不带上常量属性
在这里插入图片描述

  • 如果我们想要使迭代器带上常量属性需要加上const_
    在这里插入图片描述
    此时使用迭代器时不能改变存储在容器中的数据。
    附:其他迭代器补充:
    在这里插入图片描述
    可以去作者提供的C++参考网站上去查询函数的具体用法(建议多查找网站)

string中的Capacity

在这里插入图片描述

  • string类中有两种表示字符串长度的方法(size()和length()),这里只推荐使用size(),因为有些STL不支持length()(比如map)
max_size

max_size在不同的编译器上的结果不同。(所以使用时需谨慎,因为STL只是规范,它有许多不同的版本(大同小异),导致结果不同)
演示:
clion下:
在这里插入图片描述

  • Linux下:
    在这里插入图片描述
capacity

同max_size,在不同的编译器下的结果并不相同!
clion下:
在这里插入图片描述
Linux下:
在这里插入图片描述
同时不同的编译器的扩容机制也不相同
演示:
clion下:
在这里插入图片描述

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

clear(清理空间但并不释放空间

clion下:
在这里插入图片描述
Linux下:
在这里插入图片描述
所以clear()并不会释放空间

reserve(提前给string开空间)

在这里插入图片描述
clion下:
clion即使清理了数据,也不会进行缩容
在这里插入图片描述

Linux下:
如果清理了数据使用reserve就会进行缩容,缩为0
在这里插入图片描述
如果没有清理数据也进行缩容,缩小到size大小
在这里插入图片描述

不同的编译器reserve的效果不同,同时还与clear函数有关,clion下没实现缩容,而Linux的g++编译器下会实现缩容(使用clear清理数据后会缩到0,如果没有清理数据则会缩小到size大小)。

resize 不单单扩容,而是开空间加初始化(不给初始化值默认/0)

在这里插入图片描述
resize如果给的值比原来string的size小,并不会缩容,capacity不会改变,空间没销毁,但是字符串的长度改变了 因为缩容是有代价的,所以resize不会改变空间,以免之后还要开空间

  • 如果想要实现缩容可以用shrink_to_fit函数(具体用法查网站即可),但不建议缩容。

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

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

相关文章

AI时代来临!使用ChatGPT和Kapa.ai协助学习成长!

在加密领域畅游时&#xff0c;常常会遇到不懂的技术名词或是其背后代表的含义&#xff0c;此时通常都需要花费大量的时间进行研究和学习方能掌握。但是自从ChatGPT人工智能的出现&#xff0c;通过简单有效地运用其特性&#xff0c;不仅可以大大提高研究的效率&#xff0c;还可以…

统信UOS V20 安装mysql5.7.42详细教程

1 安装包准备 到mysql官网可以看到最新的是8.0.33&#xff0c;想下载其他版本的点击 Looking for previous GA versions?Select Operating System: 选择如下版本的mysql 安装包 2 安装 2.1 上传文件至服务器 下载后通过远程将安装包上传至服务器&#xff0c;我这里将安装…

软件测试在不同应用场景中,我们该如何进行测试呢?

在我们的日常工作中&#xff0c;我们通常接触到的都是比较复杂的系统。而复杂的系统就意味着比较复杂的测试程序。首先&#xff0c;对于复杂的系统来说&#xff0c;如果想要做功能测试&#xff0c;一般需要考虑到测试数据的问题&#xff0c;还要考虑如何从全局出发&#xff0c;…

canal 环境搭建和配置

canal 环境搭建和配置 安装依赖环境 安装canal服务端 canal客户端配置 安装依赖环境 下载Linux版jdk 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;5r2e --来自百度网盘超级会员V5的分享上传到 /soft/java目录下&#xff0c;并解压-执行如下命令 tar -zxvf jdk…

基于Java在线医疗服务系统设计与实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a; ✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精…

Media3:Android下一代媒体框架

无论您是在构建音乐播放器、视频流应用程序还是其他需要播放媒体内容的 Android 应用程序&#xff0c;拥有可靠的媒体播放库都是必不可少的。 这就是 Media3 发挥作用的地方。 什么是 Media3&#xff1f; Media3 是由 Google 作为 AndroidX 的一部分推出的强大媒体播放库。它…

从零开始 Spring Boot 38:Lombok 与依赖注入

从零开始 Spring Boot 38&#xff1a;Lombok 与依赖注入 图源&#xff1a;简书 (jianshu.com) 在之前的文章中&#xff0c;我详细介绍了 Lombok 的用法&#xff0c;考虑到在 Spring 中使用依赖注入&#xff08;DI&#xff09;是如此的频繁&#xff0c;因此有必要讨论使用 Lomb…

精通postman教程(五)postman请求参数化

作为一名测试工程师&#xff0c;那么Postman绝对是大伙必备的工具之一。 在这个系列教程中&#xff0c;我将为大伙详细讲解如何使用Postman进行API测试。 今天我带大伙实战一番postman如何请求参数化 &#xff0c;让你们快速上手这款工具。 请求参数化 数据参数化是Postman…

Kivy系列(一)—— Kivy buildozer的Docker镜像制作

接触Kivy是奔着使用python便捷又是跨平台工具去的&#xff0c;如此一套代码可以发布为各类平台的成果。但是由于网络环境限制&#xff0c;以及kivy工具链上各类工具的频繁迭代&#xff0c;即使按照github上的kivy buildozer官方文档&#xff0c;也很难打包成功&#xff0c;kivy…

调试笔记-stm32的OTA/IAP 通过485升级固件

背景&#xff1a;最近需要在stm32上实现通过rs485升级固件功能。经过几天搜索和调试&#xff0c;实现了功能。 目标&#xff1a;使用cubeIDE实现stm32F407VGT6&#xff0c;通过RS485升级固件 调试记录&#xff1a; 步骤1. 在keil环境下的rs485升级固件(含源码)&#xff1a;S…

react 18.2 官网学习笔记(1)

useMemo const cachedValue useMemo(calculateValue, dependencies)&#xff1b;参数一&#xff1a;计算要缓存的值的函数。它应该是纯的&#xff0c;不应该接受任何参数&#xff0c;并且应该返回任何类型的值。React会在初始渲染时调用你的函数。在下一次渲染时&#xff0c;…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机&#xff08;已经附上了下载地址&#xff0c;点击即可下载&#xff09;。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…

入栏需看——全国硕士研究生入学统一考试管理类专业学位联考

本栏意在收集关于全国硕士研究生入学统一考试管理类专业学位联考&#xff0c;简称管理类联考的知识点&#xff0c;考点&#xff0c;希望大家一起沟通&#xff0c;一起进步&#xff0c;管它贵不贵&#xff0c;考过了再说咯 英语 知识篇 阅读 完型填空 作文 技巧篇 第二章…

rolling的用法实例

在数据分析的过程中&#xff0c;经常用到对计算移动均值&#xff0c;使用rolling可以轻松实现这个功能~ rolling函数是一个用于时间序列分析的函数&#xff1b; 一、参数解析 首先&#xff0c;让我们来了解一下rolling的各个参数吧 DataFrame.rolling(window, min_periodsN…

Echarts—X轴鼠标滑动或者缩放/多列柱状图中某一列数据为0时不占位

这里写目录标题 需求背景图表展示X轴鼠标滑动或者缩放设置多列柱状图中某一列数据为0时不占位图表代码展示 需求背景 用柱状图展示12个月的项目对应的供应商数据&#xff1b;每个月有多个项目不确定&#xff0c;1-50之间&#xff0c;也就是说&#xff0c;12个月&#xff0c;每…

1.数据库的基本操作

SQL句子中语法格式提示&#xff1a; 1.中括号&#xff08;[]&#xff09;中的内容为可选项&#xff1b; 2.[&#xff0c;...]表示&#xff0c;前面的内容可重复&#xff1b; 3.大括号&#xff08;{}&#xff09;和竖线&#xff08;|&#xff09;表示选择项&#xff0c;在选择…

魏可伟受邀参加 2023 开放原子全球开源峰会

6月11日-13日&#xff0c;2023 开放原子全球开源峰会在京举行。作为开源行业年度盛事&#xff0c;本次峰会以“开源赋能&#xff0c;普惠未来”为主题&#xff0c;聚集政、产、学、研等各领域优势&#xff0c;汇聚顶尖大咖&#xff0c;共话开源未来。 KaiwuDB CTO 魏可伟受邀出…

Rancher的安装(k8s)

1、 Rancher概述 rancher官方文档 Rancher 是一个 Kubernetes 管理工具&#xff0c;让你能在任何地方和任何提供商上部署和运行集群。 Rancher 可以创建来自 Kubernetes 托管服务提供商的集群&#xff0c;创建节点并安装 Kubernetes&#xff0c;或者导入在任何地方运行的现有…

【总结笔记】Spring

1 Spring容器加载配置文件进行初始化。 Spring容器加载配置文件进行初始化主要有两种形式&#xff1a; 加载配置文件进行初始化&#xff1a; ClassPathXmlApplicationContext ctx new ClassPathXmlApplicationContext(“ApplicationContext.xml”); 加载配置类进行初始化&…

测试人如何打造简历化思维?三年经验软件测试简历分析

测试人如何打造简历化思维&#xff1f;如题&#xff0c;不是写如何打造简历&#xff0c;而是简历化思维&#xff0c;如何理解简历化思维&#xff1f; 很多人跟我说很累&#xff0c;不想干了&#xff0c;每天忙忙碌碌在给老板打工&#xff0c;年底老板又可以换法拉利了。 玩笑…