<C++> String

news2024/11/18 23:29:27

目录

一、标准库中的string类

1. string类

2. string类的常用接口说明

2.1 string类对象的常见构造

2.2 string类对象的容量操作

2.3 string类对象的访问及遍历操作

2.4 string类对象的修改操作

2.5 string类非成员函数 

总结


前言

         C语言中,字符串是以 '\0' 结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神还可能会越界访问。

        所以C++在早期,实现STL前,便实现了stirng类,方便使用,但是实现过早也有弊端,string与STL其他容器相较而言有些许不规范和接口冗余。

        本节我们初步学习string类中一些接口的使用,具体细节可以在https://legacy.cplusplus.com/reference/string/string/查阅 


一、标准库中的string类

1. 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) 的序列,这个类的所有成员( 如长度或大小 ) 以及它的迭代器,将仍然按照字节 ( 而不是实际编码的字符 ) 来操作。 

2. string类的常用接口说明

2.1 string类对象的常见构造

(constructor)函数名称
功能说明
string() (重点)
构造空的string类对象,即空字符串
string(const char* s) (重点)
C-string来构造string类对象
string(size_t n, char c)
string类对象中包含n个字符c
string(const string&s) (重点)
拷贝构造函数

2.2 string类对象的容量操作

函数名称
功能说明
size (重点)
返回字符串有效字符长度
length
返回字符串有效字符长度
capacity
返回空间总大小
empty (重点)
检测字符串释放为空串,是返回 true ,否则返回 false
clear (重点)
清空有效字符
reserve (重点)
为字符串预留空间
resize (重点)
将有效字符的个数该成 n 个,多出的空间用字符 c 填充

1. 对于reserve(),如果申请的空间大于capacity,那么就扩容,如果申请的空间小于capacity,根据编译器自动优化,即,如果有数据,那么就不缩减容量;如果此前使用了clear() ,没有数据,编译器认为就可以缩减容量。

翻译:

  • 如果 n 大于当前字符串容量,则该函数会导致容器将其容量增加到 n 个字符(或更大)。
  • 在所有其他情况下,收缩字符串容量被视为非约束性请求:容器实现可以自由优化,否则,字符串的容量大于 n
     

2. 对于resize(),它不仅开空间,而且会初始化填数据,如果不给值,默认填充’ \0'

翻译:

  • 如果 n 小于当前字符串长度,则当前值将缩短为其第一个 n 个字符,删除第 n 个字符以外的字符,size改变,capacity不变。
  • 如果 n 大于当前字符串长度,则通过在末尾插入所需数量的字符以达到 n 大小来扩展当前内容。如果指定了 c,则新元素初始化为 c 的副本,否则,它们是值初始化字符(空字符)。

例:

int main()
{
    string s1("hello world");

    //开空间
    s1.reserve(100);
    cout << s1.size() << endl;
    cout << s1.capacity() << endl;

    //开空间+初始化填值
    s1.resize(100);
    cout << s1.size() << endl;
    cout << s1.capacity() << endl;
    return 0;
}
打印
11
111
100
111

总结:一般情况,容量是不会缩小的,因为缩小的代价不小,因为如果单纯的只释放一部分空间,free是做不到的,只有在 clear() 后的特殊情况,再缩减,容量才会改变。

        在C++11中,又提供了一个接口 shrink_to_fit() ,可以支持缩减容量直至等于size大小

2.3 string类对象的访问及遍历操作

函数名称
功能说明
operator[ ] (重点)
返回 pos 位置的字符, const string 类对象调用
begin  + end
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭 代器
rbegin + rend
begin 获取一个字符的迭代器 + end 获取最后一个字符下一个位置的迭 代器
范围 for
C++11 支持更简洁的范围 for 的新遍历方式 

 [ ]会进行断言错误,at()会进行抛异常

int main()
{
	string s1("hello world");
	char s2[] = "hello world";
	//一个是类,一个是数组
	s1[1]++;//s1.operator[](1),类的成员函数
	s2[1]++;//*(s2 + 1),地址解引用

	return 0;
}
  • iterator是像指针一样的类型,有可能是指针,有可能不是指针。
  • iterator迭代器提供了一种统一的方式进行访问和修改容器的数据,算法可以通过迭代器去处理容器中的数据
  • [ ] 可读可写,当对象被const修饰,那么就不可修改值 
  • beign()迭代器指向第一个元素、end()迭代器指向最后一个元素的下一个位置,左闭右开这里end()指向的是 ‘\0'
  • 对于倒序遍历,rbegin()指向最后一个数据,rend()指向第一个数据的前一个位置,使用迭代器时要用——reverse_iterator
string::reverse_iterator rit = s.rbegin();
  • 对于const对象,不能用普通的迭代器,这样相当于权限放大,因为可以迭代器可以修改值,所以此时的迭代器会有另一种形式——const_iterator;同理,对于反向迭代器,如果对象被const修饰,那么迭代器应写为——const_reverse_iterator
void Func(const string& s)
{
    string::const_iterator it = s.begin();
    while (it != s.end())
    {
        cout << *it << ' ';
        it++;
    }
    cout << endl;
}

2.4 string类对象的修改操作

函数名称
功能说明
push_back
在字符串后尾插字符 c
append
在字符串后追加一个字符串
operator+= ( 重点 )
在字符串后追加字符串 str
c_str ( 重点 )
返回 C 格式字符串
find + npos ( 重点 )
从字符串 pos 位置开始往后找字符 c ,返回该字符在字符串中的位置
rfind
从字符串 pos 位置开始往前找字符 c ,返回该字符在字符串中的位置
substr
str 中从 pos 位置开始,截取 n 个字符,然后将其返回

        npos == -1,但类型是size_t,无符号数,-1表示最大值 

从pos开始,插入从subpos开始,长度为 sublen 的 string类字符串或C语言字符串,sublen不写,会默认从subpos开始全插入,sublen填写-1也可以,因为是size_t类型,-1表示最大值

        由于string是由顺序表实现的,中间的插入删除效率很低,所以不到万不得已,尽量不用 

c_str是返回一个c语言类型的数组指针,方便使用c的一些接口函数 

2.5 string类非成员函数 

函数功能说明
operator+
尽量少用,因为传值返回,导致深拷贝效率低
operator>> (重点)
输入运算符重载
operator<< (重点)
输出运算符重载
getline (重点)
获取一行字符串
relational operators (重点)
大小比较

 将其他类型转为string类型

 将string类型转为整形


总结

        本节初步了解string类的使用方法,由于string在C++早期便有了,所以它的接口有很多人吐槽冗余,由于它是由顺序表实现,插入删除在底层的实现效率不高,了解部分的接口,方便使用即可。具体更多的接口概念与定义在https://legacy.cplusplus.com/reference/string/string/网站内查询。

        下节课,我们将模拟实现string

        最后,如果小帅的本文哪里有错误,还请大家指出,请在评论区留言(ps:抱大佬的腿),新手创作,实属不易,如果满意,还请给个免费的赞,三连也不是不可以(流口水幻想)嘿!那我们下期再见喽,拜拜!

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

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

相关文章

用JMeter对HTTP接口进行压测(一)压测脚本的书写、调试思路

文章目录 安装JMeter和Groovy为什么选择Groovy&#xff1f; 压测需求以及思路准备JMeter脚本以及脚本正确性验证使用Test Script Recorder来获取整条业务线上涉及的接口为什么使用Test Script Recorder&#xff1f; 配置Test Script Recorder对接口进行动态化处理处理全局变量以…

2. 资源管理

2. 资源管理 文章目录 2. 资源管理2.1 资源管理介绍2.2 YAML语言介绍2.3 资源管理方式2.2.1 命令式对象管理2.2.2 命令式对象配置2.2.3 声明式对象配置 2.4. 模拟使用普通用户来操作 2.1 资源管理介绍 在kubernetes中&#xff0c;所有的内容都抽象为资源&#xff0c;用户需要通…

二十九、【进阶】MySQL索引的概述和索引查询

1、索引概述 2、 普通查询和索引查询 &#xff08;1&#xff09;基础演示 无索引查询&#xff1a;在查询信息时&#xff0c;比如查询年龄age45的员工&#xff0c;系统会遍历字段为age的列&#xff0c;在找到age45的员工后&#xff0c;依旧会向下扫描&#xff0c;直到表末&…

如何使用 Dijkstra 算法找到从源到所有顶点的最短路径--附C++/Java源码

给定一个图和图中的源顶点,找到从源到给定图中所有顶点的最短路径。 例子: 输入: src = 0,图形如下图所示。 输出: 0 4 12 19 21 11 9 8 14解释:从 0 到 1 的距离 = 4。 从 0 到 2 的最小距离 = 12。0->1->2 从 0 到 3 的最小距离 = 19。0 ->1-

Python基础语法(3)

目录 一、函数 1.1 函数是什么 1.2 函数语法格式 1.3 函数参数 1.4 函数返回值 a. 一个函数中可以有多个 return 语句 b. 执行到 return 语句&#xff0c;函数就会立即执行结束&#xff0c;回到调用位置 c. 一个函数是可以一次返回多个返回值的。使用 , 来分割多个返回值…

Jmeter基础篇

1.性能测试指标 【虚拟用户数】&#xff1a;线程用户 【并发数】&#xff1a;指在某一时间&#xff0c;一定数量的虚拟用户同时对系统的某个功能进行交互&#xff0c;一般通过集合点实现 【事务】:事务代表一个完整的功能&#xff0c;一个接口可以是事务&#xff0c;多个接口…

MyBatisPlus(十一)包含查询:in

说明 包含查询&#xff0c;对应SQL语句中的 in 语句&#xff0c;查询参数包含在入参列表之内的数据。 in Testvoid inNonEmptyList() {// 非空列表&#xff0c;作为参数List<Integer> ages Stream.of(18, 20, 22).collect(Collectors.toList());in(ages);}Testvoid in…

【C语言】转圈报数问题(三种方法--指针,数组)

题目&#xff1a;有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 方法一&#xff1a; #include <stdio.h> #define N 10int main() {int …

systemverilog function的一点小case

关于function的应用无论是在systemverilog还是verilog中都有很广泛的应用&#xff0c;但是一直有一个模糊的概念困扰着我&#xff0c;今天刚好有时间来搞清楚并记录下来。 关于fucntion的返回值的问题&#xff1a; function integer clog2( input logic[255:0] value);for(cl…

实验三十五、LM117 稳压电源的设计

一、题目 利用 LM117 设计一个稳压电路&#xff0c;要求输出电压的调节范围为 5 ∼ 20 V 5\sim20\,\textrm V 5∼20V&#xff0c;最大负载电流为 400 mA 400\,\textrm{mA} 400mA。利用 Multisim 对所设计电路进行仿真&#xff0c;并测试所有性能指标。 二、仿真电路 仿真电…

安装NodeJS并使用yarn下载前端依赖

文章目录 1、安装NodeJS1.1 下载NodeJS安装包1.2 解压并配置NodeJS1.3 验证是否安装成功2、使用yarn下载前端依赖2.1 安装yarn2.2 使用yarn下载前端依赖参考目标:在Windows下安装新版NodeJS,并使用yarn下载前端依赖,实现运行前端项目。 1、安装NodeJS 1.1 下载NodeJS安装包…

Vue中实现自定义编辑邮件发送到指定邮箱(纯前端实现)

formspree里面注册账号 注册完成后进入后台新建项目并且新建表单 这一步完成之后你将得到一个地址 最后就是在项目中请求这个地址 关键代码如下&#xff1a; submitForm() {this.fullscreenLoading true;this.$axios({method: "post",url: "https://xxxxxxx…

【python海洋专题十一】colormap调色

【python海洋专题十一】colormap调色 上期内容 本期内容 图像的函数包调用&#xff01; Part01. 自带颜色条Colormap 调用方法&#xff1a; cmap3plt.get_cmap(ocean)查询方法&#xff01; Part02. seaborn函数包 01&#xff1a;sns.cubehelix_palette cmap5 sns.cu…

【MySQL】错误1166 Incorrect column name

错误1166 Incorrect column name 是指字段名里有空格 Incorrect column name ‘name’ 图中报错的原因是name字段中有空格 删除空格即可

基于SpringBoot的视频网站系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 视频分享管理 视频排名管理 交流论坛管理 留言板管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运…

ParagonNTFSforMac_15.5.102中文版最受欢迎的NTFS硬盘格式读取工具

Paragon NTFS for Mac是一款可以为您轻松解决Mac平台上不能识别Windows通用的NTFS文件难题&#xff0c;这是一款强大的Mac读写工具&#xff0c;相信在很多时候&#xff0c;Mac用户需要对NTFS文件的移动硬盘进行写入&#xff0c;但是macOS系统默认是不让写入的&#xff0c;使用小…

妙不可言的Python之旅----(二)

Python基础语法 什么是字面量 字面量&#xff1a;在代码中&#xff0c;被写下来的的固定的值&#xff0c;称之为字面量 常用的值类型 类型 描述 说明 数字&#xff08;Number&#xff09; 支持 • 整数&#xff08;int&#xff09; • 浮点数&#xff08;float&#xff…

C++基础知识(二) -- 函数重载

自然语言中&#xff0c;一个词可以有多重含义&#xff0c;人们可以通过上下文来判断该词真实的含义&#xff0c;即该词被重载了。 比如&#xff1a;以前有一个笑话&#xff0c;国有两个体育项目大家根本不用看&#xff0c;也不用担心。一个是乒乓球&#xff0c;一个是男足。前者…

如何禁用Windows 10快速启动(以及为什么要这样做)

如果您不想启用Windows 10快速启动&#xff0c;则可以相对轻松地禁用它。 快速启动是一项功能&#xff0c;首先在 Windows 8 中作为快速启动实现&#xff0c;并延续到 Windows 10&#xff0c;让您的 PC 更快地启动&#xff0c;因此得名。虽然这个方便的功能可以通过将操作系统…

Qt model/view 理解01

在 Qt 中对数据处理主要有两种方式&#xff1a;1&#xff09;直接对包含数据的的数据项 item 进行操作&#xff0c;这种方法简单、易操作&#xff0c;现实方式单一的缺点&#xff0c;特别是对于大数据或在不同位置重复出现的数据必须依次对其进行操作&#xff0c;如果现实方式改…