【超详细练气篇】STL之string类---常见接口函数(1)

news2025/2/13 12:45:56

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓
在这里插入图片描述

前言

接下来就开始STL部分的学习了,本文先来学习一下C++中STL的string类

目录

  • 前言
  • 一、什么是string类
  • 二、标准库中的string类
  • 三、string类的常用接口说明
    • (1)string类中的常见构造
      • 3.1默认构造函数(string())
      • 3.2字符指针构造函数(string(const char* s))
      • 3.3字符构造函数(string str("hello");)
      • 3.4重复字符构造函数(string s(size_t n, char c))
      • 3.5拷贝构造函数(string::string(const string& str);)
      • 3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);
      • 字符串的比较
    • (2)std::string类的析构函数
    • (3) string类对象的修改操作
      • push_back()
      • append()
      • operator+=
    • (4)string类对象的访问及遍历操作
      • operator[]
        • 迭代器的小拓展

一、什么是string类

首先,string类是一个管理字符串的类。在日常中,字符串中是非常常见的,但凡是复杂一点的类型,都需要用字符串来进行展示。

在C语言中,我们学习了strxxx的库函数(管理字符串),但是其实C语言中strxxx的库函数不是很好,因为C语言中str系列的库函数只能对字符串进行一些简单的操作,比如说求字符串的长度,字符串的拷贝,很明显不能满足我们日常的需求。

而在C++中的string类中,我们可以对字符串进行各种增删查改和一些算法操作。日常中一些很复杂的信息都是用字符数组来进行展示的,故C++中的string类就是用来管理字符数组的

这里推荐一下学习C++文档的网址:

网址1
网址2(推荐用网址2),ctrl+F进行搜索。

二、标准库中的string类

在这里插入图片描述

我们如果想要使用string类的话就需要包头文件,STL本身就属于C++标准库中的一部分,而标准库中的内容都在std的命名空间中
所以如果我们想要使用string类的话,我们可以展开std的命名空间(即string s1),如果我们不展开std的命名空间的话,我们可以这样使用:std::string s2
我们先来简单使用一下string类:

#include<iostream>
using namespace std;

int main()
{
	string s1;//展开了命名空间就是这样使用
	std::string s2;//没有展开命名空间就这样使用就可以

	std::string name("李四");
	name = "李四";
	return 0;
}

这里是string类的成员函数,其实就是string类的默认成员函数
在这里插入图片描述
我们可以看到这里constructor中实现了7个构造函数,请看:
在这里插入图片描述
我们在来看destructor中的析构函数,请看:
在这里插入图片描述
我们在来看operator=中里一共有3个赋值运算符重载,请看:
在这里插入图片描述

三、string类的常用接口说明

(1)string类中的常见构造

3.1默认构造函数(string())

string str:创建一个空字符串对象
在这里插入图片描述

3.2字符指针构造函数(string(const char* s))

字符指针构造函数:从一个指向字符串的字符指针str中创建字符串对象。

const char *s = "Hello, World!";
string str(s); // 字符指针创建字符串

在这里插入图片描述

3.3字符构造函数(string str(“hello”)😉

字符构造函数:一组字符创建字符串对象,比如string str("hello");
在这里插入图片描述

3.4重复字符构造函数(string s(size_t n, char c))

重复字符构造函数(string s(size_t n, char c)):创建一个包含n个字符c的字符串对象。第一个参数是所需长度,第二个参数是重复的字符。

比如:string str(5, 'x'); // 创建一个包含5个重复字符'x'的字符串
在这里插入图片描述

3.5拷贝构造函数(string::string(const string& str);)

重复构造函数:从一个已存在的字符串对象创建新的字符串对象。
语法:string::string(const string& str);
拷贝构造函数的参数是一个常量引用,它引用了要被复制的字符串对象。拷贝构造函数会创建一个新的字符串对象,该对象的内容与被复制的字符串对象相同。

请看举例: 在这里插入图片描述

3.6 构造函数截取子串string(const string& str, size_t pos, size_t len = npos);

string(const string& str, size_t pos, size_t len = npos)是字符串类std::string的构造函数之一,它有三个参数

  • const string& str:一个常量引用,表示要从中截取子串的原字符串。
  • size_t pos:一个整数,表示从哪个位置开始截取子串。
  • size_t len = npos:一个整数,表示要截取的子串的长度,默认值为std::string::npos,表示截取从pos开始到结尾的所有字符。

该构造函数的作用:创建一个新的字符串对象,其中包含从原字符串的pos位置开始,长度为len的子串。如果len没有指定或者指定为std::string::npos,则截取到原字符串的结尾。

例如:假设有一个字符串str=“Hello,
world!”,我们想要从中截取子串"world",可以通过如下方式使用该构造函数:std::string sub_str(str, 7, 5); // 从位置7开始截取长度为5的子串

其中,7表示从第8个字符开始,5表示指定的子串长度。在这个例子中,sub_str 的值为 “world”。

需要注意的是,在使用该构造函数时,pos和len都必须是有效的,否则可能导致未定义的行为。例如,如果len的值超过原字符串的长度,可能会访问非法内存。为了避免这种情况,可以使用std::string::substr()函数来截取子串。

string (const string& str, size_t pos, size_t len = npos);
在这里插入图片描述
这里npos是什么呢?我们来看一下:
在这里插入图片描述

npos是一个静态成员变量
在这里插入图片描述
在这里插入图片描述

再举一些比较有趣的例子,请看:
在这里插入图片描述

字符串的比较

现在来看一下比较字符串的内容,请看:
在这里插入图片描述
在这里插入图片描述

好了,以上就是string类中的常见的默认构造函数,用到比较多的构造函数:无参的构造,带参的字符串构造和拷贝构造。

(2)std::string类的析构函数

std::string类的析构函数会自动释放字符串所占用的内存,其定义如下:

~string();

因为std::string类是基于动态内存分配来实现字符串的,因此在对象被销毁时,它所占用的内存也需要被释放。std::string类的析构函数会自动调用delete[]来释放动态分配的内存,确保不会出现内存泄漏的情况。

需要注意的是,当在std::string对象的作用域结束时,析构函数会被自动调用,对应的内存也会被释放。在删除对象时,不需要显式调用析构函数。

(3) string类对象的修改操作

push_back()

push_back():用于在字符串的末尾添加一个新的字符。
例如:

string str = "hello";
str.push_back('!');
// 现在str的值为 "hello!"。

append()

append():用于在字符串的末尾添加新的字符或字符串。
例如:

string str = "hello";
str.append(" world");
// 现在str的值为 "hello world"

在这里插入图片描述

operator+=

operator+=:在字符串后追加字符串str。
在这里插入图片描述
在这里插入图片描述

(4)string类对象的访问及遍历操作

operator[]

在这里插入图片描述

operator[]:用于访问字符串中每一个字符的下标运算符。
第一种语法:用于非常量对象,返回一个指向字符串中位置 pos 的字符的引用。可以对该引用进行修改,从而改变字符串中该字符的值。

在这里插入图片描述
在这里插入图片描述
第二种语法:用于常量对象,返回一个指向字符串中位置 pos 的字符的常引用。由于该引用是常量引用,因此不能对它进行修改,只能用于读取字符串中的字符。
在这里插入图片描述
这里我们表面上看着str1[0]++str2[0]++是一样的,但实际上是不一样的。
在这里插入图片描述

迭代器的小拓展

下面是迭代器的一个小拓展,这里先了解一下:
在这里插入图片描述
在这里插入图片描述
我们也可以对迭代器进行修改,请看:
在这里插入图片描述

范围for底层就是一个迭代器:
在这里插入图片描述

任何容器都支持迭代器

int main()
{
	list<int> lt;
	lt.push_back(520);
	lt.push_back(521);
	lt.push_back(522);
	lt.push_back(523);
	list<int>::iterator lit = lt.begin();
	while (lit != lt.end())
	{
		cout << *lit << ' ';
		lit++;
	}
	cout << endl;
	return 0;
}

在这里插入图片描述

总结一下
迭代器是一个像指针一样的类型,有可能是指针,有可能不是指针。
iterator提供了一种统一的方式来访问修改容器的数据。
算法可以通过迭代器去修改容器中的数据。

好了,本文就到这里了,主要介绍了string类中的常见接口函数。算是打开了string类的一个大门。
一起加油吧,各位友友们!再见啦!!!
在这里插入图片描述

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

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

相关文章

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析

企业级ChatGPT开发入门实战直播21课第2课 运行日志及代码解析 Gavin老师在企业级ChatGPT开发入门实战直播21课第2课中,讲解的ChatGPT应用案例开发架构图: ChatGPT案例运行日志 2023-06-11 16:06:57 DEBUG Calling on_part_begin with no data 2023-06-11

完型填空技巧

完形中分值最高的是逻辑关系题&#xff0c;逻辑关系分为两种&#xff0c;一种是选项就是逻辑关系的&#xff0c;例: Given the advantages of electronic money, you might thinkthat we would move quickly to the cashless society in which allpayments are made electronic…

常用设计模式(三)

接着之前的思路今天来介绍一下常用的设计模式有哪些 单例模式&#xff08;Singleton Pattern&#xff09; 又称为单体模式&#xff0c;保证一个类只有一个实例&#xff0c;并提供一个访问它的全局访问点。也就是说&#xff0c;第二次使用同一个类创建新对象的时候&#xff0c…

机器学习-8 集成学习

集成学习 集成学习理论集成学习概述集成学习理论 随机森林算法原理Scikit-learn中的随机森林分类器函数原型sklearn.ensemble.RandomForestClassifier(n_estimators10,criteriongini,max_depthNone,min_samples_split2,min_samples_leaf1,min_weight_fraction_leaf0.0,max_feat…

pytorch深度学习框架—torch.nn模块(一)

pytorch深度学习框架—torch.nn模块 torch.nn模块中包括了pytorch中已经准备好的层&#xff0c;方便使用者调用构建的网络。包括了卷积层&#xff0c;池化层&#xff0c;激活函数层&#xff0c;循环层&#xff0c;全连接层。 卷积层 pytorch中针对使用场景的不同&#xff0c;有…

多云时代来临,容器存储谁敢横刀立马?

多云时代来临&#xff0c;容器存储谁敢横刀立马&#xff1f; 原创2023-06-12 21:54大数据在线 2011年&#xff0c;Gartner提出了数字化转型的理念&#xff1b;十多年来&#xff0c;企业数字化经历了移动化、云化等几次变革潮流&#xff0c;如今走入一个新的时代&#xff1a;多…

Docker 生成 golang 程序镜像

一. 准备golang程序 package mainimport "github.com/gin-gonic/gin"func main() {go func() {r1 : gin.Default()r1.GET("/sayHello/", func(c *gin.Context) {c.JSON(200, "hello1")})r1.Run(":8992")}()r : gin.Default()r.GET(&q…

详解Linux内核安全技术——磁盘加密技术概述和eCryptfs

一、概述 加密是最常见的数据安全保护技术&#xff0c;在数据生命周期各阶段均有应用。从应用场景和技术实现上&#xff0c;按加密对象、用户是否感知、加密算法等维度&#xff0c;有多种分类及对应方案&#xff0c;并在主流操作系统如Windows、Linux、Android中有广泛应用。 …

AWS CodeWhisperer 简单介绍

一、何为AWS CodeWhisperer Amazon CodeWhisperer能够理解以自然语言&#xff08;英语&#xff09;编写的注释&#xff0c;并能实时生成多条代码建议&#xff0c; 以此提高开发人员生产力。 二、主要功能 Amazon CodeWhisperer 的主要功能&#xff0c;包括代码生成、引用追踪…

12.异常检测

12.1 异常检测的应用 异常检测最常见的应用是欺诈检测&#xff1b; 如果你有很多用户&#xff0c;每个用户都在从事不同的的活动&#xff0c;你可以对不同的用户活动计算特征变量&#xff0c;然后可以建立一个模型来表示用户表现出各种行为的可能性&#xff0c;用来表示用户行…

LiangGaRy-学习笔记-Day22

1、shell工具-tput 这个是tput bash工具 具体的操作如下&#xff1a; tput clear&#xff1a;清屏tput cup Y X 第Y行&#xff0c;第X列的位置 tput bold&#xff1a;字体加粗tput sgr0 &#xff1a; 重置命令tput setaf n n&#xff1a;代表数字0-7 0黑色1红色2绿色3黄色4蓝…

【Protobuf速成指南】Map类型的使用

文章目录 2.4 map 类型一、 基本认识二、map相关函数4.3 contact2.4的改写 2.4 map 类型 本系列文章将通过对通讯录项目的不断完善&#xff0c;带大家由浅入深的学习Protobuf的使用。这是Contacts的2.4版本&#xff0c;在这篇文章中将带大家学习Protobuf的 map 语法&#xff0c…

Java自制绘图软件

引言 在大连时接触了Java&#xff0c;Java非常优雅&#xff0c;我非常喜欢。期末老师要做一个项目作品&#xff0c;看着windows自带的画图软件&#xff0c;我决定自己动手做一个绘图软件。经过无数次界面调试&#xff0c;刷新层叠关系令我爆肝了一个月&#xff0c;最终完成了这…

没有AI歌手一键包,纯纯的算法项目

项目地址&#xff1a; https://github.com/PlayVoice/so-vits-svc-5.0 来源丨元语音技术 本项目的目标群体是&#xff1a;深度学习初学者&#xff0c;具备Pyhon和PyTorch的基本操作是使用本项目的前置条件&#xff1b; 本项目旨在帮助深度学习初学者&#xff0c;摆脱枯燥的纯…

2023年6月最新|大屏可视化

大屏可视化 一、可视化适配 大屏下显示一般都是16:9尺寸 1920*1080 &#xff0c;做适配也就是在这个比例的基础上进行的 方案一&#xff1a;打开VSCode终端&#xff0c;下载flexible npm i lib-flexible修改源码 要修改的源码的路径&#xff1a; 项目/mode_modules/lib-fl…

Springboot+Vue服务器盲盒活动

文章目录 一、项目要求二、说明文档1、用户抽奖主页/raffle2、多种奖品链接1、奖品1 discont /discount2、奖品2 CPU upgrade /cpu3、奖品3 Memory upgrade /memory4、奖品4 Increase duration /duration5、奖品5 Send to server /server6、奖品6 Configuration upgrade /upgra…

信必优成功案例-全球Tops汽车技术供应商

该集团是全球Tops汽车技术供应商&#xff0c;业务范围涵盖了汽油系统、柴油系统、汽车底盘控制系统、汽车电子驱动、起动机与发电机、电动工具、家用电器、传动与控制技术、热力技术和安防系统等。信必优于2021年开始为该客户服务&#xff0c;参与了客户多个项目&#xff0c;以…

Android进阶 四大组件的工作过程(二):Service的工作过程

Android进阶 四大组件的工作过程&#xff08;二&#xff09;&#xff1a;Service的工作过程 导语 本片文章主要是来介绍Service组件的工作过程的&#xff0c;主要分成Service的启动和Service的绑定两个部分来讲。上一篇文章我们已经介绍了Activity的工作工程&#xff0c;而Ser…

Windows软件:如何安装ideaIU-2020.3.3并使用无限重置插件达到永久使用

​前言&#xff1a; ​在我们做SpringBoot Java项目时&#xff0c;一个好的开发工具可以让我们的效率达到事半功倍&#xff0c;早期的eclipse已经无法满足我们日常需求&#xff0c;当然idea集成开发工具在很早前就已经进入市场&#xff0c;如今取得了无法撼动的地位&#xff0c…

度学习pytorch实战六:ResNet50网络图像分类篇自建花数据集图像分类(5类)超详细代码

1.数据集简介、训练集与测试集划分 2.模型相关知识 3.model.py——定义ResNet50网络模型 4.train.py——加载数据集并训练&#xff0c;训练集计算损失值loss&#xff0c;测试集计算accuracy&#xff0c;保存训练好的网络参数 5.predict.py——利用训练好的网络参数后&#xff0…