『C++成长记』string使用指南

🔥博客主页:小王又困了
📚系列专栏:C++
🌟人之为学,不日近则日退
❤️感谢大家点赞👍收藏⭐评论✍️

目录
一、string类介绍
二、string类的常用接口说明
📒2.1string类对象的常见构造
📒2.2string类对象的容量操作
📒2.3string类对象的访问及遍历操作
📒2.4string类对象的修改操作
编辑
📒2.5string类对象的查找接口
📒2.6string类非成员函数
🗒️前言:
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数, 但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。C++中引入了string类,给我们提供了便利。
一、string类介绍
- string是表示字符串的字符串类
- string类的接口与常规容器的接口基本相同,再添加了一些专门用来操作string的常规操作。
- string在底层实际是:basic_string模板类的别名,typedef basic_string string;。
- 不能操作多字节或者变长字符的序列。
小Tips:在使用string类时,必须包含#include头文件以及using namespace std;。
二、string类的常用接口说明
📒2.1string类对象的常见构造
🎀string()
构造空的string类对象,即空字符串。
int main() {string s1;cout << s1 << endl;return 0; }
🎀string(const char* s)
用一个C的字符串(或字符数组)来构造一个string类的对象。
int main() {string s1("hellow world");cout << s1 << endl;return 0; }
🎀string(size_t n, char c)
用 n 个字符来构建string类对象。
int main() {string s1(5, 'x');cout << s1 << endl;return 0; }
🎀string(const string&s)
string类的拷贝构造,用于构建一个和存在的s1一模一样的对象。
int main() {string s1(5, 'x');string s2(s1);cout << s2 << endl;return 0; }
🎀string(const string& str,size_t pos,size_t len=npos)
复制str从pos位置开始len个字符的部分,使用一个已存在的string类对象的一部分来创建一个新的string类对象。
小Tips:nops是string类里面的一个静态成员变量,它是size_t类型,初始化为-1,即表示整型的最大值。
int main() {string s1("hellow world");string s2(s1, 7, 5);cout << s2 << endl;return 0; }
🎀string(const char* s,size_t n)
用 s 所指向字符串(或字符数组)的前 n 个字符来初始化创建一个string类对象。
int main() {char s[] = "hellow ,world";string s1(s, 6);cout << s1 << endl;return 0; }
📒2.2string类对象的容量操作
🎀size()
返回字符串有效字符长度
int main() {string s1("hellow world");string s2("hellow C++");cout << s1.size() << endl;cout << s2.size() << endl;return 0; }
🎀length()
返回字符串有效字符长度
int main() {string s1("hellow world");string s2("hellow C++");cout << s1.length() << endl;cout << s2.length() << endl;return 0; }
小Tips:size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
🎀capacity()
返回string对象空间的总大小。
int main() {string s1("hellow world");string s2("hellow world xxxxxxx");cout << s1.capacity() << endl;cout << s2.capacity() << endl;return 0; }
小Tips:capacity()会返回对象空间的总大小,这个空间是存储有效字符的空间,实际上会多开辟一个空间,存储‘\0’。同一个对象在不同的环境开辟的空间不同,在不同环境下扩容机制也不同。
📖VS下的扩容机制
int main() {string s1("hellow world");size_t old = s1.capacity();cout << old << endl;for (size_t i = 0; i < 100; i++){s1.push_back('x');if (old != s1.capacity()){cout << s1.capacity() << endl;old = s1.capacity();}}return 0; }
VS下默认开辟15个空间用来存储数据(本质上是开16个空间,因为还要存‘/0’),第一次扩容是2倍,后面都是以1.5倍的大小去扩容。
📖Linux下的扩容机制
在Linux环境下最初对象需要多少空间就开多少,后面一次按照2倍的大小进行扩容。
🎀reserve(size_t n = 0)
为字符串预留空间。直接一次开辟n个空间,可以用来存储n个有效字符,可以避免每次都要去扩容。
int main() {string s1("hellow world");s1.reserve(100);size_t old = s1.capacity();cout << s1.capacity() << endl;for (size_t i = 0; i < 100; i++){s1.push_back('x');if (old != s1.capacity()){cout << s1.capacity() << endl;old = s1.capacity();}}return 0; }
小Tips:当我们确定需要多少空间,就可以使用reserve()提前开辟好空间即可,可以减少扩容次数, 大部分的扩容都是异地扩容,扩容次数过多会影响效率。
🎀resize(size_t n = 0, char c)
resize(size_t n)与resize(size_t n, char c)都是将字符串中有效字符个数改变到n个,当n小于当前字符串的长度size(),会保留前n个字符,将第n个字符后面的所以字符删除;当n大于当前字符串的长度size(),先会进行扩容,不同的是当字符个数增多时:resize(size_t n)用‘\0’来填充多出的元素空间,resize(size_t n, char c)用字符c来填充多出的元素空间。
int main() {string s1("hellow world");cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;s1.resize(100,'x');cout << s1 << endl;cout << s1.size() << endl;cout << s1.capacity() << endl;return 0; }
小Tips:resize在改变元素个数时,如果是将元素个数增多,可能会改变底层容量的大小,如果是将元素个数减少,底层空间总大小不变。 reserve只会影响容量,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小,即不会缩容。
- reserve只影响容量,不影响数据
- resize既影响容量,也影响数据
🎀clean()
清理有效字符,不改变容量大小
int main() {string s1("Hello C++!");cout << "清空之前的size:" << s1.size() << endl;cout << "清空之前的capacity:" << s1.capacity() << endl;s1.clear();cout << "清空之后的size:" << s1.size() << endl;cout << "清空之后的capacity:" << s1.capacity() << endl;return 0; }
小Tips:clear()只是将string中有效字符清空,不改变底层空间大小。
📒2.3string类对象的访问及遍历操作
🎀operator()
返回pos位置的字符
int main() {string s1 = "hellow world";for (size_t i = 0; i < s1.size(); i++){cout << s1[i];}cout << endl;return 0; }
小Tips:如果字符串是const限定的,则该函数返回const char&。否则,它将返回char&。at借口与operator[]借口功能类型,operator[]接口发生越界访问,程序会直接报错;at接口发生越界访问的时候会抛出异常。
🎀begin、end/rebegin、rend
begin获取对象第一个字符的迭代器,end获取对象最后一个字符下一个位置的迭代器
int main() {string s1 = "hellow world";string::iterator it = s1.begin();while (it != s1.end()){cout << *it;it++;}cout << endl;string::reverse_iterator it = s1.rbegin();//反向迭代器while (it != s1.rend()){cout << *it;it++;}cout << endl;return 0; }
如上代码我们看到迭代器和指针的使用方法类似,都可以解引用和++,对象也可以修改。但迭代器的这些操作都是通过运算符重载来实现的。
小Tips:迭代器区间永远都是左闭右开,迭代器类型作为类的内置类型可以通过类名
::itertator直接访问,例如:string::itertator就表示string类里面的迭代器类型。普通迭代器可读可写,const迭代器限制的是其指向的内容,只能读不能写,而const迭代器本身可以修改。
🎀范围for
int main() {string s1("Hello world");for (auto it : s1){cout << it;}cout << endl;return 0; }
小Tips:范围for就是基于迭代器实现的,在底层范围for会转化成正向迭代器。
📒2.4string类对象的修改操作
🎀push back
在字符串后尾插字符c
int main() {string s1("Hello world");cout << "追加前:" << s1 << endl;s1.push_back('x');cout << "追加后:" << s1 << endl;return 0; }
🎀append
在字符串后追加一个字符串,它有六种重载形式,如下图所示:
int main() {string s1("Hello world");cout << "追加前:" << s1 << endl;s1.append("xxxxxxx");cout << "追加后:" << s1 << endl;string s2 = "abcdefg";cout << "追加前:" << s1 << endl;s1.append(s2, 2, 4);cout << "追加后:" << s1 << endl;return 0; }
🎀operator+=
通过重载运算符+=实现追加,该运算符重载有三种重载实现形式,如下图所示:
int main() {string s1("Hello world");cout << "追加前:" << s1 << endl;s1 += "xxxxxx";cout << "追加后:" << s1 << endl;string s3 = "abcdefg";string s2("Hello world");cout << "追加前:" << s2 << endl;s2 += s3;cout << "追加后:" << s2 << endl;return 0; }
小Tips:在string尾部追加字符的三种方式中,+=操作用的比较多,+=操作不仅可以连接单个字符,还可以连接字符串。
📒2.5string类对象的查找接口
🎀find
从字符串的pos位置开始往后查找字符或字符串,返回其在当前字符串中的位置。
int main() {string s1 = "hellow world";string s2 = "world";size_t pos = s1.find(s2);cout << pos << endl;return 0; }
🎀substr
在str中从pos位置开始,截取n个字符,然后将其返回
int main() {string s1 = "test.txt.cpp";size_t pos = s1.rfind('.');if (pos != string::npos){string s2 = s1.substr(pos);cout << s2 << endl;}return 0; }
📒2.6string类非成员函数
| 函数名称 | 功能说明 |
| operator+ | 尽量少用,因为传值返回,导致深拷贝效率低 |
| operator>> | 输入运算符重载 |
| operator<< | 输出运算符重载 |
| getline | 获取一行字符串 |
| relational operators | 大小比较 |
小Tips:operator>>和getline的区别在于,前者遇到空格‘ ’和换行‘\n’会截止,而后者默认只有遇到换行‘\n’才截止,因此当我们需要从键盘读取一个含有空格的字符串是,只能用getline。
🎁结语:
本次的内容到这里就结束啦。希望大家阅读完可以有所收获,同时也感谢各位读者三连支持。文章有问题可以在评论区留言,博主一定认真认真修改,以后写出更好的文章。你们的支持就是博主最大的动力。
相关文章:
『C++成长记』string使用指南
🔥博客主页:小王又困了 📚系列专栏:C 🌟人之为学,不日近则日退 ❤️感谢大家点赞👍收藏⭐评论✍️ 目录 一、string类介绍 二、string类的常用接口说明 📒2.1string类对象的常…...
硬件连通性测试:构建数字世界的无形基石
在当今数字化的时代,硬件设备的连通性对于系统的正常运行至关重要。硬件连通性测试作为确保设备协同工作的关键步骤,扮演着构建数字世界的无形基石的角色。本文将深入探讨硬件连通性测试的意义、方法以及在现代科技生态系统中的重要性。 1. 硬件连通性测…...
mysql的安装与卸载
mysql的安装 mysql 8.0的安装步骤: 1. 从mysql官网上下载mysql安装软件 https://www.mysql.com/ 2. 双击msi文件进行安装 3. 选择安装的类型 选择server only可以远程访问数据库 4. 选择服务并安装 5. 安装中,安装完成后直接next 6. 进入mysql的配置 …...
假期作业 2.2
第一章 命名空间 一.选择题 1、编写C程序一般需经过的几个步骤依次是( B ) A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数…...
运维SRE-02 正则表达式、grep
1.特殊符号补充 1.1位置相关的特殊符号 . 当前目录 .. 当前目录的上级目录 ~ 当前用户家目录 / 根目录 cd - 返回上次所在目录1.2熟练掌握 # 注释符号,root命令提示符 | 管道符号.1.3了解其他特殊符号 $ 取值(取出变量的值),普通用户的提示符 ! % ^ & * (){} [] ; ? \…...
【SpringCloud】使用OpenFeign进行微服务化改造
目录 一、需求与背景二、OpenFeign 远程调用技术原理三、项目代码演示3.1 引入依赖3.2 实现OpenFeign注解修饰接口3.3 指定 OpenFeign 远程调用接口的扫描路径 四、OpenFeign 在日志中打印Request和Response五、OpenFeign 客户端超时配置六、使用 OpenFeign 实现服务降级6.1 实…...
DRV8313和L298N都是电机驱动,一个是驱动三相FOC无刷直流电机的,一个是驱动有刷电机,使stm32控制无刷电机简单入门知识
DRV8313和L298N都是电机驱动器,但它们之间存在一些关键的区别: DRV83131: 由德州仪器(TI)制造。 具有集成的场效应晶体管(FET)。 最大电压为65V。 峰值电流为3A。 适用于三相电机驱动。 L298N…...
React16源码: React中event事件系统初始化源码实现
event 事件系统初始化 1 )概述 react事件系统比较的复杂,它是基于dom的事件系统在dom事件系统上面进行了一个深度的封装它里面的很多实现逻辑都是自由的一套在初始化 react-dom 的源码的时候,会为react的事件系统注入 reactdom 相关的一些插…...
Qt6入门教程 15:QRadioButton
目录 一.简介 二.常用接口 三.实战演练 1.径向渐变 2.QSS贴图 3.开关效果 4.非互斥 一.简介 QRadioButton控件提供了一个带有文本标签的单选按钮。 QRadioButton是一个可以切换选中(checked)或未选中(unchecked)状态的选项…...
Json序列化和反序列化 笔记
跟着施磊老师学C 下载:GitHub - nlohmann/json: JSON for Modern C 在single_include/nlohmann里头有一个json.hpp,把它放到我们的项目中就可以了 #include "json.hpp" using json nlohmann::json;#include <iostream> #include <…...
新媒体与传媒行业数据分析实践:从网络爬虫到文本挖掘的综合应用,以“中国文化“为主题
大家好,我是八块腹肌的小胖, 下面将围绕微博“中国文化”以数据分析、数据处理、建模及可视化等操作 目录 1、数据获取 2、数据处理 3、词频统计及词云展示 4、文本聚类分析 5、文本情感倾向性分析 6、情感倾向演化分析 7、总结 1、数据获取 本…...
Visual Studio使用Git忽略不想上传到远程仓库的文件
前言 作为一个.NET开发者而言,有着宇宙最强IDE:Visual Studio加持,让我们的开发效率得到了更好的提升。我们不需要担心环境变量的配置和其他代码管理工具,因为Visual Studio有着众多的拓展工具。废话不多说,直接进入正…...
Nginx简单阐述及安装配置
目录 一.什么是Nginx 二.Nginx优缺点 1.优点 2.缺点 三.正向代理与反向代理 1.正向代理 2.反向代理 四.安装配置 1.添加Nginx官方yum源 2.使用yum安装Nginx 3.配置防火墙 4.启动后效果 一.什么是Nginx Nginx(“engine x”)是一个高性能的HTTP…...
【遥感入门系列】遥感分类技术之遥感解译
遥感的最终成果之一就是从遥感图像上获取信息,遥感分类是获取信息的重要手段。同时遥感图像分类也是目前遥感技术中的热点研究方向,每年都有新的分类方法推出。 本小节主要内容: 遥感分类基本概念常见遥感分类方法 1 遥感分类概述 遥感图…...
解决:IDEA无法下载源码,Cannot download sources, sources not found for: xxxx
原因 Maven版本太高,遇到http协议的镜像网站会阻塞,要改为使用https协议的镜像网站 解决方案 1.打开设置 2. 拿到settings.xml路径 3. 将步骤2里箭头2的User settings file:settings.xml打开,作以下修改 保存即可。如果还不行…...
什么是IDE,新手改如何选择IDE?
IDE 是 Integrated Development Environment(集成开发环境)的缩写,它是一种软件应用程序,为程序员提供了一站式的开发环境,整合了多种工具和服务,以便高效地创建、修改、编译、调试和运行软件程序。IDE 集成…...
springBoot+Vue汽车销售源码
源码描述: 汽车销售管理系统源码基于spring boot以及Vue开发。 针对汽车销售提供客户信息、车辆信息、订单信息、销售人员管理、 财务报表等功能,提供经理和销售两种角色进行管理。 技术架构: idea(推荐)、jdk1.8、mysql5.X(不能为8驱动不匹配)、ma…...
FPS游戏框架漫谈第五天
今天想了想整理下AnimatorManager 他的职责是负责动画的播放,那么在介绍该对象具备的对外接口,必须先介绍下拥有动画的对象他是怎么管理动画数据的,打个比方如果我们一个把武器需要播放开火动画,那么我们基于unity引擎可视化动画编…...
83.如何设计高可用系统
文章目录 一、简介二、导致系统不可用的常见原因三、高可用系统设计基本原则四、容错性设计五、弹性伸缩六、可观测七、安全防护设计八、自动化 一、简介 什么是高可用 高可用是指系统在面对各种故障和异常情况时,仍能够提供稳定、可靠的服务。对于企业和用户而言&…...
Map和Set讲解
🎥 个人主页:Dikz12📕格言:那些在暗处执拗生长的花,终有一日会馥郁传香欢迎大家👍点赞✍评论⭐收藏 目录 集合框架 模型 Set 常见方法和说明 Set总结 Map说明 Map常见方法和说明 Map 中HashMap的 …...
收藏!小白也能看懂的大模型如何改写工业效率?
收藏!小白也能看懂的大模型如何改写工业效率? 本文介绍了中控技术的TPT大模型在工业生产中的应用,它通过实时监控、自动计算最优参数和风险预警,帮助企业提升效率、降低成本。与互联网领域的AI应用不同,工业AI的价值更…...
asp毕业设计下载(全套源码+配套论文)——基于asp+sqlserver的WEB社区论坛设计与实现
基于aspsqlserver的WEB社区论坛设计与实现(毕业论文程序源码) 大家好,今天给大家介绍基于aspsqlserver的WEB社区论坛设计与实现,更多精选毕业设计项目下载见文末哦。 文章目录: 基于aspsqlserver的WEB社区论坛设计与…...
从SOP到AI Society:MGX多智能体协作平台如何重塑软件开发流程
1. MGX平台如何用SOP机制颠覆传统开发模式 我第一次接触MGX平台时,被它的标准化操作流程(SOP)惊艳到了。这就像把一个混乱的施工现场变成了井然有序的装配线,每个智能体都知道自己该在什么时候做什么事。传统开发中,我…...
VitePress 博客主题定制与美化实战
1. VitePress主题美化的核心思路 很多开发者在使用VitePress搭建博客时,都会遇到一个共同的问题:默认主题虽然简洁,但缺乏个性。我在实际项目中发现,通过CSS变量覆盖、自定义组件和插件扩展这三个维度,可以打造出极具辨…...
编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法
编译原理避坑指南:自顶向下语法分析的5个常见错误及解决方法 第一次接触自顶向下语法分析时,我盯着那个无限循环的递归文法整整三天没想明白——为什么明明按照教材步骤操作,程序却始终报错?直到助教指出我忽略了间接左递归的隐蔽…...
PostgreSQL 模式级权限迁移:一键批量修改所有表与对象的所有者
1. 为什么需要批量修改PostgreSQL对象所有者? 在实际的数据库运维工作中,经常会遇到需要批量修改数据库对象所有者的情况。我遇到过不少这样的场景:公司部门重组后,原先由开发团队A负责的项目转交给团队B维护;或者某个…...
3大突破:重新定义Revit插件开发流程
3大突破:重新定义Revit插件开发流程 【免费下载链接】RevitAddInManager Revit AddinManager update .NET assemblies without restart Revit for developer. 项目地址: https://gitcode.com/gh_mirrors/re/RevitAddInManager 引言:Revit插件开发…...
树莓派5跑n8n稳吗?实测Docker部署性能与避坑指南(Ubuntu 24.04 + 安全加固)
树莓派5实战:n8n工作流自动化平台的Docker部署与性能调优指南 在物联网与自动化技术蓬勃发展的今天,如何以最低成本构建稳定可靠的工作流自动化系统成为许多开发者和企业关注的重点。树莓派5凭借其出色的性价比和低功耗特性,配合Docker容器化…...
从XMind到禅道:定制化脚本实现测试用例高效导入
1. 为什么需要从XMind导入测试用例到禅道? 在日常测试工作中,XMind思维导图因其直观的结构和高效的编辑方式,成为很多测试工程师编写测试用例的首选工具。我自己也深有体会,用XMind梳理测试点特别顺手,一个下午就能完成…...
绿色低碳+高效交付:中集模块化数据中心用实力印证中国方案全球竞争力
随着人工智能与绿色转型成为全球经济增长核心引擎,高算力需求正推动数据中心建设向预制化、高效能方向加速演进。中集集团(000039.SZ/2039.HK)凭借工业化制造与全球交付优势,2025年在模块化数据中心(AIDC)领…...

























