【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,否则返回falsecout << 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;// 范围forfor (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 worldaaacout << 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 worldaaareturn 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容器也有很大帮助!

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

在这里插入图片描述

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

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

相关文章

前端(JS)对URL的编码和解码方式以及重要性——IE浏览器必须对中文URL进行编码

工作记录-前端——前端&#xff08;JS&#xff09;对URL的编码和解码方式以及重要性——IE浏览器必须对中文URL进行编码 创作场景前端JS对URL的三种编码和解码方式1. escape 和 unescape2. encodeURI 和 decodeURI3. encodeURIComponent 和 decodeURIComponent 本文重点 创作场…

net语言编程:深入探索其奥秘与挑战

net语言编程&#xff1a;深入探索其奥秘与挑战 在当今信息化社会&#xff0c;编程语言如同构建数字世界的砖瓦&#xff0c;而net语言编程便是其中的一颗璀璨明珠。它以其独特的魅力吸引着无数开发者&#xff0c;但同时也伴随着一系列令人困惑和充满挑战的问题。本文将从四个方…

大模型学习资料整理:如何从0到1学习大模型,搭建个人或企业RAG系统,如何评估与优化(更新中...)

通过本文您可以了解到&#xff1a; 学习&#xff1a;从小白如何入手&#xff0c;从0到1开始学习大模型。RAG系统&#xff1a;我想搭建属于自己或者企业的RAG系统&#xff0c;我该怎么去做&#xff1f;评估&#xff1a;微调后的模型或者RAG系统&#xff0c;如何评估自己的模型和…

windows配置dns访问git , 加快访问速度保姆级教程

设置 DNS 访问 Git 需要修改电脑的 DNS 配置。下面是具体的操作流程&#xff1a; 第一步&#xff1a;打开命令提示符或终端窗口 在 Windows 系统中&#xff0c;可以按下 Win R 组合键&#xff0c;然后输入 “cmd”&#xff0c;按下 Enter 键打开命令提示符窗口。在 macOS 或 …

【活动】GPT-4O:AI语言生成技术的新里程碑

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 GPT-4O&#xff1a;AI语言生成技术的新里程碑引言GPT系列简史回顾GPT-1: 初露锋…

国际荐酒师(香港)协会亮相香港国际葡萄酒和烈酒展览会

2024年5月28日至30日&#xff0c;备受瞩目的香港国际葡萄酒和烈酒展览会VINEXPO Hong Kong在香港盛大举办。作为亚太区最盛大的葡萄酒展会&#xff0c;本届展会不仅吸引了全球葡萄酒和烈酒行业的目光&#xff0c;更见证了国际荐酒师&#xff08;香港&#xff09;协会&#xff0…

(2) qml诞生的原因 和Qt Creator开发环境的介绍

文章目录 qml诞生原因Qt Quick应⽤程序Qt Creator环境1、MSVC2、MinGWMSVC的优缺点MinGW的优缺点 最后的选择延伸阅读 一些常用的快捷键统一格式化代码统一qml 语言的格式Locator 定位器帮助 qml诞生原因 可以在Qt5中开发的不同类型的经典应⽤程序。桌⾯应⽤程 序正在发⽣着改…

物联网断点续传

断点续传是一种在网络传输中断后&#xff0c;能够从中断的位置继续传输的技术。它可以有效地避免因为网络不稳定、服务器故障、用户操作等原因导致的传输失败&#xff0c;节省了用户的时间和流量&#xff0c;提高了传输的效率和可靠性。断点续传在很多场景中都有广泛的应用&…

GIS结合物联网:塑造智慧地球的新篇章

在信息技术飞速发展的今天&#xff0c;地理信息系统&#xff08;GIS&#xff09;与物联网&#xff08;IoT&#xff09;的深度融合&#xff0c;正以前所未有的方式重塑着我们对世界的认知。本文将深入探讨GIS与物联网结合的原理、应用实践以及面临的挑战与未来展望&#xff0c;共…

乡村振兴与乡村旅游品牌化:打造具有地方特色的乡村旅游品牌,提升乡村旅游吸引力,促进美丽乡村建设

目录 一、引言 二、乡村旅游品牌化的重要性 &#xff08;一&#xff09;增强乡村旅游的辨识度 &#xff08;二&#xff09;提升乡村旅游的附加值 &#xff08;三&#xff09;促进乡村文化的传承与创新 三、打造具有地方特色的乡村旅游品牌 &#xff08;一&#xff09;明…

Python知识点6---列表和元组

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python的列表和和元组定义方式如下&#xff0c;且注意列表和元组拥有…

【深度强化学习入门:结合直觉与算法的学习之旅】

文章目录 前言深度强化学习的关键要素简单的深度Q网络&#xff08;DQN&#xff09;实现分析代码结论 前言 深度强化学习结合了深度学习的表征学习能力和强化学习的决策制定机制&#xff0c;这使得机器能够在复杂环境中自我学习并做出合理的行动策略。它在游戏玩耍、自动驾驶、…

Linux实验报告(二)——Linux系统中的常用命令

目录 一、实验名称&#xff1a; 二、仪器、设备&#xff1a; 三、参考资料&#xff1a; 四、实验目的&#xff1a; 五、实验内容&#xff08;步骤&#xff09;&#xff1a; 六、实验数据&#xff08;程序&#xff09;记录&#xff1a; ​编辑 ​编辑 七、实验结果分析…

Python知识点9---推导式

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python提供的推导式&#xff0c;只对列表、字典、集合三种数据类型生…

公司网站模板制作

公司网站模板的制作是一项极其重要的工作&#xff0c;因为网站模板决定了网站的整体风格和用户体验。一个漂亮、易用的网站模板将会吸引更多的用户&#xff0c;而一个糟糕的网站模板则会让用户不供选择。下面就让我们介绍一下公司网站模板的制作。 首先&#xff0c;一个好的网站…

iCold编程入门:探索未知的编程世界

iCold编程入门&#xff1a;探索未知的编程世界 在浩瀚的数字宇宙中&#xff0c;iCold编程犹如一颗璀璨的新星&#xff0c;吸引着无数好奇而勇敢的探险家。然而&#xff0c;对于初学者来说&#xff0c;这个神秘的世界往往充满了未知与挑战。今天&#xff0c;我们就将一同踏入这…

前端 CSS 经典:mac docker 效果

前言&#xff1a;浏览器上实现 mac docker 效果&#xff0c;实现思路&#xff0c;1. 布局&#xff0c;方框间距用元素代替&#xff0c;因为有放大缩小功能&#xff0c;不用元素的话&#xff0c;不好控制。2. 定义个 css 变量 i&#xff0c;用来代表放大比例。3. 确定每个元素的…

信息系统项目管理师软考高级论文教程必过论文分享

很多人提到软考就会想到信息系统项目管理师和系统集成项目管理工程师&#xff0c;这两个不同的软考内容的区别不仅仅在于一个是高级&#xff0c;一个是中级&#xff0c;还有一个区别是它们的考试内容也是不同的&#xff0c;高级的信息系统项目管理师考试多了一项论文的考试&…

K-means 聚类算法和K-means ++聚类算法详解【5】

1、通俗易懂的讲解链接 补充链接&#xff0c;K- means算法的K值选择策略&#xff1a;链接一&#xff0c;链接二​​​​​​​&#xff1b; 后续关键点渐次补充

MySQL入门学习-查询进阶.正则表达式

在 MySQL 中&#xff0c;正则表达式是用于匹配文本模式的工具。正则表达式可以用于在查询中进行模式匹配&#xff0c;以便更精确地查找和操作数据。 一、以下是一些常见的查询进阶操作和正则表达式的特点、使用方法以及与其他比较和高级应用的示例&#xff1a; 1. LIKE操作符…