当前位置: 首页 > news >正文

【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容器也有很大帮助!

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

在这里插入图片描述

相关文章:

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

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;C模板入门 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀STL之string &#x1f4d2;1. STL基本…...

一、初识Qt 之 Hello world

一、初识Qt 之 Hello world 提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 初识Qt 之 Hello world文章目录 一、Qt 简介二、Qt 获取安装三、Qt 初步使用四、Qt 之 Hello world1.新建一个项目 总结 一、Qt 简介 C &#xf…...

nginx搭建简单负载均衡demo(springboot)

目录 1 安装nignx 1.1 执行 brew install nginx 命令&#xff08;如果没安装brew可百度搜索如何安装brew下载工具。类似linux的yum命令工具&#xff09;。 1.2 安装完成会有如下提示&#xff1a;可以查看nginx的配置文件目录。 1.3 执行 brew services start nginx 命令启动…...

SpringBoot的第二大核心AOP系统梳理

目录 1 事务管理 1.1 事务 1.2 Transactional注解 1.2.1 rollbackFor 1.2.2 propagation 2 AOP 基础 2.1 AOP入门 2.2 AOP核心概念 3. AOP进阶 3.1 通知类型 3.2 通知顺序 3.3 切入点表达式 execution切入点表达式 annotion注解 3.4 连接点 1 事务管理 1.1 事务…...

react、vue动态form表单

需求在日常开发中反复写form 是一种低效的开发效率&#xff0c;布局而且还不同这就需要我们对其封装 为了简单明了看懂代码&#xff0c;我这里没有组件&#xff0c;都放在一起&#xff0c;简单抽离相信作为大佬的你&#xff0c;可以自己完成&#xff0c; 一、首先我们做动态f…...

halcon程序如何导出C#文件

1.打开halcon文件&#xff1b; 2.写好需要生成C#文件的算子或函数&#xff1b; 3.找到档案-输出&#xff0c;如下图&#xff1b; 4.点击输出&#xff0c;弹出如下窗口 &#xff08;1&#xff09;可以修改导出文件的存储路径 &#xff08;2&#xff09;选择C#-HALCON/.NET &…...

RabbitMQ三、springboot整合rabbitmq(消息可靠性、高级特性)

一、springboot整合RabbitMQ&#xff08;jdk17&#xff09;&#xff08;创建两个项目&#xff0c;一个生产者项目&#xff0c;一个消费者项目&#xff09; 上面使用原生JAVA操作RabbitMQ较为繁琐&#xff0c;很多的代码都是重复书写的&#xff0c;使用springboot可以简化代码的…...

第八十九周周报

学习目标&#xff1a; 论文 学习时间&#xff1a; 2024.05.25-2024.05.31 学习产出&#xff1a; 一、论文 SAN: INDUCING METRIZABILITY OF GAN WITH DISCRIMINATIVE NORMALIZED LINEAR LAYER 将GAN与切片最优输运联系起来&#xff0c;提出满足方向最优性、可分离性和单射…...

Centos升级Openssh版本至openssh-9.3p2

一、启动Telnet服务 为防止升级Openssh失败导致无法连接ssh&#xff0c;所以先安装Telnet服务备用 1.安装telnet-server及telnet服务 yum install -y telnet-server* telnet 2.安装xinetd服务 yum install -y xinetd 3.启动xinetd及telnet并做开机自启动 systemctl enable…...

茉莉香飘,奶茶丝滑——周末悠闲时光的绝佳伴侣

周末的时光总是格外珍贵&#xff0c;忙碌了一周的我们&#xff0c;终于迎来了难得的闲暇。这时&#xff0c;打开喜欢的综艺&#xff0c;窝在舒适的沙发里&#xff0c;再冲泡一杯香飘飘茉莉味奶茶&#xff0c;一边沉浸在剧情的海洋中&#xff0c;一边品味着香浓丝滑的奶茶&#…...

揭秘:Java字符串对象的内存分布原理

先来看看下面寄到关于String的真实面试题&#xff0c;看看你废不废&#xff1f; String str1 "Hello"; String str2 "Hello"; String str3 new String("Hello"); String str4 new String("Hello");System.out.println(str1 str2)…...

Vue.js - 生命周期与工程化开发【0基础向 Vue 基础学习】

文章目录 Vue 的生命周期Vue 生命周期的四个阶段Vue 生命周期函数&#xff08;钩子函数 工程化开发 & 脚手架 Vue CLI**开发 Vue 的两种方式&#xff1a;**脚手架目录文件介绍项目运行流程组件化开发 & 根组件App.vue 文件&#xff08;单文件组件&#xff09;的三个组成…...

Element-UI 快速入门指南

Element-UI 快速入门指南 Element-UI 是一套基于 Vue.js 的桌面端组件库,由饿了么前端团队开发和维护。它提供了丰富的 UI 组件,帮助开发者快速构建美观、响应式的用户界面。本篇文章将详细介绍 Element-UI 的安装、配置和常用组件的使用方法,帮助你快速上手并应用于实际项…...

2024华为OD机试真题-整型数组按个位值排序-C++(C卷D卷)

题目描述 给定一个非空数组(列表),其元素数据类型为整型,请按照数组元素十进制最低位从小到大进行排序, 十进制最低位相同的元素,相对位置保持不变。 当数组元素为负值时,十进制最低位等同于去除符号位后对应十进制值最低位。 输入描述 给定一个非空数组,其元素数据类型…...

善听提醒遵循易经原则。世界大同只此一路。

如果说前路是一个大深坑&#xff0c;那必然是你之前做的事情做的不太好&#xff0c;当坏的时候&#xff0c;坏的结果来的时候&#xff0c;是因为你之前的行为&#xff0c;你也就不会再纠结了&#xff0c;会如何走出这个困境&#xff0c;是好的来了&#xff0c;不骄不躁&#xf…...

CrossOver有些软件安装不了 用CrossOver安装软件后如何运行

CrossOver为用户提供了三种下载软件的方式分别是&#xff1a;搜索、查找分类、导入。如果【搜索】和【查找分类】提供的安装资源不能成功安装软件&#xff0c;那么我们可以通过多种渠道下载安装包&#xff0c;并将安装包以导入的方式进行安装。这里我们以QQ游戏为例&#xff0c…...

在vue中如何使用leaflet图层展示地图

在vue中如何使用leaflet <template><div id"map" class"map"></div> </template><script> export default {data () {return {};},mounted(){this.initMaps()},methods: {initMaps () {const map L.map(map, {zoomControl…...

mybatisplus 字段存的是json 在查询的时候怎么映射成对象

数据库交互对象 TableName(value "表名", autoResultMap true)TableField(typeHandler JacksonTypeHandler.class, value "user_info")private User user;autoResultMap 是一个 MyBatis-Plus 中的注解属性&#xff0c;用于控制是否自动生成结果映射。…...

Python 学习笔记【1】

此笔记仅适用于有任一编程语言基础&#xff0c;且对面向对象有一定了解者观看 文章目录 数据类型字面量数字类型数据容器字符串列表元组 type()方法数据类型强转 注释单行注释多行注释 输出基本输出连续输出&#xff0c;中间用“,”分隔更复杂的输出格式 变量定义del方法 标识符…...

Git系列:rev-parse 使用技巧

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

交通事故车辆受损情况数据集分享(适用于YOLO系列深度学习分类检测任务)

交通事故车辆受损情况数据集分享&#xff08;适用于YOLO系列深度学习分类检测任务&#xff09; 源码下载链接:https://pan.baidu.com/s/1zYLg1EOwHB-HTBlxQr4w7A?pwdyhmd 提取码:yhmd前言 随着道路交通量的不断增加&#xff0c;交通事故的发生频率也呈现上升趋势。事故发生后&…...

3DMax对齐功能全解析:从基础操作到高阶建模实战

1. 3DMax对齐功能基础入门 刚接触3D建模的新手最常遇到的困扰就是&#xff1a;为什么我的模型总是对不齐&#xff1f;记得我第一次用3DMax做建筑模型时&#xff0c;花了两小时都没能把一扇窗户准确地装到墙面上。直到后来掌握了对齐工具&#xff0c;才发现原来这种问题5秒钟就能…...

如何用Python快速接入Taotoken平台调用多模型API

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 如何用Python快速接入Taotoken平台调用多模型API 对于希望快速体验不同大模型能力的开发者而言&#xff0c;逐一对接各家厂商的API…...

树莓派Pico舵机控制库picoclaw:从PWM原理到多舵机机器人应用

1. 项目概述&#xff1a;一个为树莓派Pico量身打造的舵机控制库如果你玩过树莓派Pico&#xff0c;并且尝试过用它来控制舵机&#xff0c;那你大概率会遇到一个头疼的问题&#xff1a;Pico的MicroPython固件本身并没有内置专门的舵机控制库。这意味着你需要自己动手&#xff0c;…...

移步皆海景处处可停留,读懂大连海岸的松弛质感

沿着大连的滨海路漫步&#xff0c;你会遇见这座城市最从容的一面。这条贯穿海滨风景线的道路&#xff0c;串联起星海广场、森林动物园、老虎滩海洋公园等多个开放型景观区域&#xff0c;核心特点在于它并不急于展示某个单一景点&#xff0c;而是将城市生活与自然海岸融为一体—…...

PlayAI多语种同步翻译实测报告:98.7%端到端准确率、<320ms平均延迟,如何在12种语言间零感知切换?

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PlayAI多语种同步翻译功能详解 PlayAI 的多语种同步翻译功能基于端到端神经机器翻译&#xff08;NMT&#xff09;架构与实时语音流处理引擎深度融合&#xff0c;支持中、英、日、韩、法、西、德、俄等 …...

硬件调试利器:全面掌握AMD Ryzen处理器系统性能优化实战技巧

硬件调试利器&#xff1a;全面掌握AMD Ryzen处理器系统性能优化实战技巧 【免费下载链接】SMUDebugTool A dedicated tool to help write/read various parameters of Ryzen-based systems, such as manual overclock, SMU, PCI, CPUID, MSR and Power Table. 项目地址: http…...

从IMU到UWB:拆解美国队长盾牌自主归位的嵌入式控制核心

1. 项目概述&#xff1a;从电影梦到工程挑战每个看过《美国队长》的人&#xff0c;大概都幻想过能像史蒂夫罗杰斯那样&#xff0c;潇洒地掷出那面标志性的振金盾牌&#xff0c;看着它在空中划出完美的弧线&#xff0c;击倒敌人后又精准地飞回手中。这不仅是超级英雄的浪漫&…...

Nornir网络自动化监控插件:集成Sentry实现异常告警与上下文追踪

1. 项目概述&#xff1a;一个为Nornir网络自动化框架量身定制的告警与监控插件 如果你和我一样&#xff0c;长期使用Nornir框架来管理成百上千的网络设备&#xff0c;那你一定遇到过这样的场景&#xff1a;一个精心编写的自动化任务在测试环境跑得飞快&#xff0c;一旦放到生产…...

贾子竞争哲学与新范式升维战略——从 “多维对抗“ 到 “意义消解“ 的终极战略蓝图

贾子竞争哲学与新范式升维战略——从 "多维对抗" 到 "意义消解" 的终极战略蓝图摘要本战略体系彻底颠覆了以价格、功能、渠道为核心的传统红海对抗逻辑&#xff0c;提出了一套基于 "维度升维、悖论锁定、意义消解、时间收割" 的全新竞争哲学。其…...