【C++进阶】深入STL之string:掌握高效字符串处理的关键

📝个人主页🌹:Eternity._
⏩收录专栏⏪:C++ “ 登神长阶 ”
🤡往期回顾🤡:C++模板入门
🌹🌹期待您的关注 🌹🌹

在这里插入图片描述

在这里插入图片描述

❀STL之string

  • 📒1. STL基本介绍
    • 🎈STL的版本
    • 🎩STL的缺陷
  • 📒2. string类的基本概念
  • 📒3. string类的常用操作
    • 🌈string类对象的常见构造
    • 🌞string类对象的容量操作
    • 🌙string类对象的访问及遍历操作
    • ⭐string类对象的修改操作
  • 📒4. 总结拓展
    • 🔥拓展:getline
    • 💧总结


前言:STL(Standard Template Library,标准模板库)是C++标准库的重要组成部分,它提供了一系列通用的数据结构和算法。在STL中,string类是一个非常重要的容器,用于处理字符串数据。本文将详细介绍STL中的string类,包括其基本概念、常用操作以及使用示例

STL的六大组件
在这里插入图片描述

📒1. STL基本介绍

🎈STL的版本

  • 原始版本
    Alexander Stepanov、Meng Lee 在惠普实验室完成的原始版本,本着开源精神,他们声明允许任何人任意运用、拷贝、修改、传播、商业使用这些代码,无需付费。唯一的条件就是也需要向原始版本一样做开源使用。 HP 版本–所有STL实现版本的始祖。
  • P. J. 版本
    由P. J. Plauger开发,继承自HP版本,被Windows Visual C++采用,不能公开或修改,缺陷:可读性比较低,符号命名比较怪异。
  • RW版本
    由Rouge Wage公司开发,继承自HP版本,被C+ + Builder 采用,不能公开或修改,可读性一般。
  • SGI版本
    由Silicon Graphics Computer Systems,Inc公司开发,继承自HP版 本。被GCC(Linux)采用,可移植性好,可公开、修改甚至贩卖,从命名风格和编程 风格上看,阅读性非常高。我们后面学习STL要阅读部分源代码,主要参考的就是这个版本

🎩STL的缺陷

  • STL库的更新太慢了。这个得严重吐槽,上一版靠谱是C++98,中间的C++03基本一些修订。C++11出来已经相隔了13年,STL才进一步更新。
  • STL现在都没有支持线程安全。并发环境下需要我们自己加锁。且锁的粒度是比较大的。
  • STL极度的追求效率,导致内部比较复杂。比如类型萃取,迭代器萃取。
  • STL的使用会有代码膨胀的问题,比如使用vector/vector/vector这样会生成多份代码,当然这是模板语法本身导致的

📒2. string类的基本概念

string类是一个模板类,专门用于处理字符串数据。 在C++中,字符串是由一系列字符组成的序列,而string类则提供了对这些字符序列进行高效操作的功能。与传统的C语言风格字符串(以\0结尾的字符数组)相比,string类更加安全和易用,因为它会自动管理内存,并提供了丰富的成员函数来操作字符串
在这里插入图片描述


string类成员函数:

class string
{
private:
	char* ——str;
	int _capacity;
	int _size;
};

在这里插入图片描述


📒3. string类的常用操作

🌈string类对象的常见构造

函数名称功能说明
string()构造空的string类对象,即空字符串
string(const char* s)用const对象来构造string类对象
string(size_t n, char c)string类对象中包含n个字符c
string(s.begin(), s.end())用迭代区间构造
string(const string&s)拷贝构造函数
int main()
{
	string s1(); // 空字符串
	string s2("hello world"); // const对象构造string类对象
	string s3(10, 'x'); // n个字符c构造
	string s4(s2.begin(), s2.end()); // 用迭代区间构造
	string s5 = s2; // 拷贝构造
	return 0;
}

注意:在这里迭代器类似于指针!


🌞string类对象的容量操作

函数名称功能说明
size返回字符串有效字符长度
length返回字符串有效字符长度
capacity返回空间总大小
empty检测字符串释放为空串,是返回true,否则返回false
clear清空有效字符
reserve为字符串预留空间
resize将有效字符的个数该成n个,多出的空间用字符c填充
int main()
{
	string s("hello world");
	// 返回字符串有效字符长度
	cout << s.size() << endl;
	cout << s.length() << endl;
	// 返回空间总大小
	cout << s.capacity() << endl;
	// 检测字符串释放为空串,是返回true,否则返回false
	cout << s.empty() << endl;
	// 清空有效字符
	s.clear();
	cout << "clear after: " << s << endl;
	// 为字符串预留空间
	s.reserve(100); // 一般会多预留空间
	cout << "reserve(100)after: " << s.size() << endl;
	cout << "reserve(100)after: " << s.capacity() << endl;
	
	cout << endl;
	// 将有效字符的个数该成n个,多出的空间用字符c填充
	s.resize(100);
	cout << "resize(100)after: " << s.size() << endl;
	cout << "resize(100)after: " << s.capacity() << endl;
	return 0;
}

在这里插入图片描述

注意:

  • size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
  • clear()只是将string中有效字符清空,不改变释放空间
  • reserve()只会变大,如果是将元素个数减少,底层空间总大小不变
  • resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变

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

函数名称功能说明
operator[ ]返回pos位置的字符,const string类对象调用
begin+ end begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭代器
rbegin + rend begin获取一个字符的迭代器 + end获取最后一个字符下一个位置的迭器
范围forC++11支持更简洁的范围for的新遍历方式
int main()
{
	string s("hello world");
	for (int i = 0; i < s.size(); i++)
	{
		cout << s[i];
	}
	cout << endl;
	// 迭代器
	string::iterator it = s.begin();
	while (it != s.end())
	{
		cout << *it;
		it++;
	}
	cout << endl;
	// 范围for
	for (auto ch : s)
	{
		cout << ch;
	}
	cout << endl;
	return 0;
}

关于迭代器
在这里插入图片描述
迭代器的用法像指针一样能够+–也可以解引用拿到指向的内容


⭐string类对象的修改操作

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

注意:npos是无符号的整形,值为-1,npos是int的最大值
在这里插入图片描述


int main()
{
	string s1("h");
	// 插入字符
	s1.push_back('e');
	//插入字符串
	s1.append("llo ");
	s1 += "world";
	// 将s1变成 hello world
	//c_str函数返回字符串从\0结尾的字符串,但是c++中的字符串不一定
	s1 += '\0';
	s1 += "aaa";
	cout << s1 << endl; // hello worldaaa
	cout << s1.c_str() << endl; // hello world

	// find  从pos位置开始查找字符并返回其位置
	// rfind  从pos位置开始往前查找字符并返回其位置
	int ret = s1.find('l',3);
	cout << s1[++ret] << endl; // o

	//substr  从ret位置开始截取pos个字符,如果pos不传参数将会截取到最后
	string s2 = s1.substr(0);
	cout << s2 << endl; // hello worldaaa
	return 0;
}

这里要注意的是:

  • c_str,C格式字符串是以’\0’结尾的但是C++里面不一定
  • substr,当我们没有结束位置时,它会遍历完整个字符串
  • 关于修改操作其实还有inserterase,但是这两个涉及挪动数据,效率不高,能不用就不用
string s1("hello world!!!");
// 头插
s1.insert(0, 1, 'x');
// 删除
s1.erase(0,5);

我们来查阅一下这三个函数
在这里插入图片描述
insert可以在pos位置插入一个字符,一个字符串或者一个string类甚至还可以指定插入字符串的长度,insert接口有很多
在这里插入图片描述
erase可以删除从pos位置往后len个字符,如果pos不传参数,则从0位置删除npos个
在这里插入图片描述


📒4. 总结拓展

🔥拓展:getline

getline是用于从输入流中读取一行字符串并保存到指定的字符串变量中的函数,直到遇到换行符或达到指定的最大字符数

在这里插入图片描述
代码演示:

int main()
{
    string s;
    getline(cin, s);
    cout << s << endl;
    cout << endl;
    cin >> s;
    cout << s << endl;
    return 0;
}

在这里插入图片描述

💧总结

在深入学习和掌握了STL中string类的运用后,我们可以深刻感受到C++在处理字符串时的灵活性和高效性。通过合理利用string提供的各种成员函数和特性,实现更加高效且易于维护的代码。对于学习后面的STL容器也有很大帮助!

在这里插入图片描述
谢谢大家支持本篇到这里就结束了,祝大家天天开心!

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java版本家政上门系统源码,自主研发、安全可控,支持任意二次开发

家政上门系统源码&#xff0c;Java版本&#xff0c;自主研发、安全可控。支持任意二次开发、有丰富合作案例。多端管理&#xff1a;管理端、用户端、服务端。 技术参数&#xff1a; 技术架构&#xff1a;springboot、mysql 、Thymeleaf 开发语言&#xff1a;java1.8、vue 开…

【智能AI相机】基于AI的新型成像和照明技术

缩短检测时间 降低废品率和成本 更快捕捉更多缺陷 ” Trevista CI Dome将康耐视专利的计算成像算法与结构化漫射圆顶照明相结合&#xff0c;提供无与伦比的地形图像质量&#xff0c;为光泽和哑光表面检测提供创新解决方案。有助于&#xff1a;缩短检测时间、降低废品率和成本…

通俗易懂->哈希表详解

目录 一、什么是哈希表&#xff1f; 1.1哈希表长什么样&#xff1f; 1.2为什么会有哈希表&#xff1f; 1.3哈希表的特点 1.3.1 取余法、线性探测 1.3.2 映射 1.3.3负载因子 1.4哈希桶 1.5闲散列与开散列 1.6总结 二、设计hash表 1、哈希表的设计 1&#xff09;插入…

ChatGPT在工作中的使用案例

知识点提示 开发过程中&#xff0c;遇到某个知识点&#xff0c;忘记或者不清楚怎么使用了&#xff0c;通过ChatGPT快速生成使用提示和案例。代码库“字典” 比如C 11 判断数组所有元素为false 在 C11 中&#xff0c;可以使用标准库中的 all_of 算法来判断数组中的所有元素是…

RAG 之 Embedding 模型 (一)

本文主要对 RAG 常见的 Embedding 模型 M3E 进行介绍。 一、M3E 1.1 简介 M3E 是 Moka Massive Mixed Embedding 的缩写。 Moka&#xff0c;此模型由 MokaAI 训练&#xff0c;开源和评测&#xff0c;训练脚本使用 uniem &#xff0c;评测 BenchMark 使用 MTEB-zh Massive&…

【计算机视觉】数字图像处理基础知识(模拟和数字图像、采样量化、像素的基本关系、灰度直方图、图像的分类)

一、图像的基本概念 图像(image)&#xff1a;图像这个简单单词其实包含两方面含义&#xff1a; “图”&#xff1a;是指物体反射光or透射光的分布“像”&#xff1a;接收和记录其分布所得到的结果&#xff08;如&#xff1a;人的视觉系统所接收“图”在人脑中形成的映像或认识&…

从CSV到数据库(简易)

需求&#xff1a;客户上传CSV文档&#xff0c;要求CSV文档内容查重/插入/更新相关数据。 框架&#xff1a;jdbcTemplate、commons-io、 DB&#xff1a;oracle 相关依赖&#xff1a; 这里本来打算用的2.11.0&#xff0c;无奈正式项目那边用老版本1.3.1&#xff0c;新版本对类型…

整数之间的赋值问题

前言&#xff1a;我们在初学C语言的时候&#xff0c;总是避免不了一些数据类型的转换&#xff0c;例如int-->char&#xff0c;char-->int&#xff0c;如果我们仅仅只学习这些语法&#xff0c;而不去了解底层原理&#xff0c;对于这些输出的内容&#xff0c;我们可能会感觉…

集成建筑5G商城为建筑行业开拓新方向

集成建筑5G商城为建筑行业开拓新方向 建筑业在我国有着悠久的发展历史&#xff0c;近年来&#xff0c;伴随着我国经济的快速增长、城镇化步伐加快&#xff0c;我国房地产、建筑业持续增长&#xff0c;建筑业显现出巨大的发展潜力。建筑行业近年来始终保持较高的增长速度。根据…

拉格朗日插值法的推导

1、插值的基本定义   设函数 y f ( x ) yf(x) yf(x)在区间 [ a , b ] [a,b] [a,b]上有定义&#xff0c;且已知它在 n 1 n1 n1个互异点 a ≤ x 0 < x 1 < . . . < x n ≤ b a\leq x_0<x_1<...<x_n\leq b a≤x0​<x1​<...<xn​≤b上的函数值 y 0 …

房产证上加名?手把手教你操作,省钱又省心!

随着《民法典》的实施&#xff0c;房产的权属问题愈发受到重视。夫妻双方及其亲属常希望能在房产证上增添自己的名字&#xff0c;以保障各自的权益。那么&#xff0c;房产证上到底能写几个名字呢&#xff1f;以下是对这一问题的详细解答。 一、房产证命名无固定限制 在购房时&…

MAB规范(1):概览介绍

前言 MATLAB的MAAB&#xff08;MathWorks Automotive Advisory Board&#xff09;建模规范是一套由MathWorks主导的建模指南&#xff0c;旨在提高基于Simulink和Stateflow进行建模的代码质量、可读性、可维护性和可重用性。这些规范最初是由汽车行业的主要厂商共同制定的&…

手写HTML字符串解析成对应的 AST语法树

先看效果 展示如下&#xff1a; HTML模版 转成ast语法树后 在学习之前&#xff0c;我们需要了解这么一个问题&#xff0c;为什么要将HTML字符串解析成对应的 AST语法树。 为什么&#xff1f; 语法分析&#xff1a;HTML字符串是一种标记语言&#xff0c;其中包含了大量的标签…

电动汽车电子系统架构

电动汽车的普及正在稳步发展&#xff0c;供应链的各个环节也在发生变化。它涵盖了制造电动汽车零件的原材料、化学品、电池和各种组件。与此同时&#xff0c;汽车充电基础设施也参与其中&#xff0c;它们正经历一个历史性的阶段&#xff0c;经过彻底的重新设计。它们的电气化以…

Echarts实现半圆形饼图,Echarts实现扇形图

效果预览,此处的双半圆扇形图是使用v-for循环的出来的 dom部分 <template><div><div class="mainDiv"><div class="headTit">全校平台最近作业</div><div class="loopSubject"><div id="app"…

反射获取成员变量

目录 利用反射获取成员变量 ​编辑 代码实现 获取class对象 获取成员变量 获取单个成员变量 获取成员变量的名字 获取权限修饰符 获取成员变量的数据类型 获取成员变量记录的值 修改对象里面记录的值 利用反射获取成员变量 代码实现 Student类&#xff1a; 获取clas…

JVM学习-类加载过程(二)

Initialization初始化阶段 为类的静态变量赋予正确的初始值 具体描述 类的初始化是类装载的最后一个阶段&#xff0c;如果前面的步骤没有问题&#xff0c;那么表示类可以顺利装载到系统中&#xff0c;此时&#xff0c;类才会开始执行Java字节码(即&#xff0c;到了初始化阶段…

使用YOLOv10训练自己的数据集

1. yolov10源码下载 THU-MIG/yolov10: YOLOv10: Real-Time End-to-End Object Detection (github.com)https://github.com/THU-MIG/yolov10?tabreadme-ov-file 2. 环境配置 预先安装好ANACONDA、PyCharm或者VSCode等基本软件。参考以下博客&#xff1a; 史上最全最详细的An…

六一礼物怎么选?来用python采集几套试卷送给小朋友们吧

马上要六一了&#xff0c;想一想我小时候的儿童节老师大概率都会布置一些试卷&#xff0c;所以也算是渡过了一个很"快乐"的童年呢。 所以今天这篇文章来采集一下试卷网中的试卷&#xff0c;快来学习一下&#xff0c;然后采集几套试卷送给你身边还在上学的小朋友们吧…

《面试笔记》——MySQL终结篇30

三大范式&#xff1f; 第一范式&#xff1a;字段具有原子性&#xff0c;不可再分&#xff08;字段单一职责&#xff09; 第二范式&#xff1a;满足第一范式&#xff0c;每行应该被唯一区分&#xff0c;加一列存放每行的唯一标识符&#xff0c;称为主键&#xff08;都要依赖主…