string 的介绍及使用
一.string类介绍
C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理,稍不留神可能还会越界访问。
C++中将string封装为单独的类,string 类是 C++ 标准库中的一个非常重要的类,用于表示和操作字符串。string类位于命名空间std(标准库)下,使用string类记得加上头文件#include,并且使用命名空间using namespace std或者using std::string。注意:string低层还是模版。
二.string类的常用接口
1.构造函数(constructor)
1、无参构造:string(); 构造空的string类对象,即空字符串。常用。
2、有参构造:string (const char* s); 用常量字符串来构造string类对象常用。
3、拷贝构造:string (const string& str); 用str拷贝构造string类对象常用。
4、string (const string& str, size_t pos, size_t len = npos); 构造从下标pos开始,长度为len的子串,含缺省参数npos。
5、string (const char* s, size_t n); 构造前n个字符组成的子串。
6、string (size_t n, char c); 构造n个字符c组成的字符串。
int main()
{string s1;string s2("hello xzy");string s3(s2);string s4(s2, 6, 3);string s5("hello xzy", 5);string s6(10, 'x');cout << s1 << endl;//输出:cout << s2 << endl;//输出:hello xzycout << s3 << endl;//输出:hello xzycout << s4 << endl;//输出:xzycout << s5 << endl;//输出:hellocout << s6 << endl;//输出:xxxxxxxxxxreturn 0;
}
2、析构函数(destructor)
~string(); 程序结束前自动调用,释放堆区动态开辟的资源
3.运算符重载(operator )
1.operator=
- string& operator= (const string& str); 常用。
- string& operator= (const char* s);
- string& operator= (char c);
int main()
{string s1;string s2;string s3;//赋值重载s1 = "hello xzy";s2 = s1;s3 = 'v';//拷贝构造string s4 = s1;cout << s1 << endl;//输出:hello xzycout << s2 << endl;//输出:hello xzycout << s3 << endl;//输出:vcout << s4 << endl;//输出:hello xzyreturn 0;
}
2.operator[ ]
int main()
{string s1("hello xzy");s1[6] = 'w';s1[7] = 'j';s1[8] = '\0';cout << s1 << endl; //输出:hello wjs1[10] = 'A'; //下标越界,内部断言assert报错return 0;
}
3.operator+=
- string& operator+= (const string& str); 常用。
- string& operator+= (const char* s);
- string& operator+= (char c);
int main()
{string s1("hello xzy");string s2(" how are you");s1 += s2;cout << s1 << endl;s1 += "???";cout << s1 << endl;s1 += '!';cout << s1 << endl;return 0;
}
4.operator+
- string operator+ (const string& lhs, const string& rhs);
- string operator+ (const string& lhs, const char* rhs);
- string operator+ (const char* lhs, const string& rhs);
int main()
{string s1("hello");string s2 = s1 + " world";string s3 = "xzy " + s1;string s4 = s2 + s3;cout << s2 << endl; //hello worldcout << s3 << endl; //xzy hellocout << s4 << endl; //hello worldxzy helloreturn 0;
}
4、string的四种迭代器(iterator)
迭代器是一种用于遍历容器元素的对象(并非类,而是设计模式中的一种行为模式),它提供了一种通用的访问容器元素的方式,无论容器的类型和数据结构如何。迭代器在C++标准库中被广泛使用,特别是在处理如vector、list、map等容器时。
1.正向迭代器 iterator
返回正向迭代器:可以修改字符串。
1、iterator begin(); 返回字符串的第一个字符。
2、iterator end(); 返回字符串最后一个有效字符(不含\0)的下一个字符。
int main()
{string s1("hello ryc");string::iterator it = s1.begin();while (it != s1.end()){cout << *it << " ";++it;}cout << endl;return 0;
}
2.反向迭代器 reverse_iterator
返回反向迭代器:可以修改字符串。
reverse_iterator rbegin(); 返回字符串最后一个有效字符(不含\0)。
reverse_iterator rend(); 返回字符串第一个字符的前一个字符。
int main()
{string s1("hello ryc");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit << " ";rit++;}cout << endl;return 0;
}
3.const修饰的正向迭代器 const_iterator
返回const修饰的正向迭代器:不可以修改字符串。
- const_iterator begin() const;
- const_iterator end() const;
4.const修饰的反向迭代器 const_reverse_iterator
返回const修饰的反向迭代器:不可以修改字符串。
- const_reverse_iterator rbegin() const;
- const_reverse_iterator rend() const;
5.string类对象的容量操作
- size_t size() const; 返回字符串有效字符长度(不包括\0)。常用。
- size_t length() const; 返回字符串有效字符长度(不包括\0)。
- size_t capacity() const; 返回空间总大小(不包括\0)。常用。
- void resize (size_t n); 为字符串预留大于等于n的空间(不包括\0),避免扩容,提高效率。常用。
- void clear(); 清空数据,但是一般不清容量。常用。
- bool empty() const; 判断是否为空。常用。
注意:
- size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
- clear()只是将string中有效字符清空,不改变底层空间大小。
6.string类对象的修改操作
- void push_back (char c); 在字符串后尾插字符c。
- void pop_back(); 在字符串尾删一个字符。
- string& append (const string& str); 在字符串后追加一个字符串。
- string& assign (const string& str, size_t subpos, size_t sublen); 拷贝字符串:从下标为subpos开始,拷贝长度为sublen的字符串到string类对象里面。
- string& insert (size_t pos, const string& str); 在pos位置处插入字符串到string类对象里面。(由于效率问题(移动数据),谨慎使用)。
- string& erase (size_t pos = 0, size_t len = npos); 从pos位置开始删除长度为npos个字符。(由于效率问题(移动数据),谨慎使用)。
- void swap (string& str); 交换字符串。
- string& replace (size_t pos, size_t len, const string& str); 从pos位置开始的长度为len的子串,替换为str。(伴随着插入与删除,效率低,谨慎使用)。
int main()
{string s1("hello ryc");s1.push_back('!');cout << s1 << endl;s1.pop_back();cout << s1 << endl;s1.append("666");cout << s1 << endl;//可以使用+=代替尾差s1 += "maldsk";cout << s1 << endl;s1.insert(0, "why");cout << s1 << endl;string s2("why did you do so? I don't know!");s2.erase(0, 1);cout << s2 << endl;s2.replace(0,2,"adw2y");cout << s2 << endl;string s5("hello x hello x");string tmp;tmp.reserve(s5.size());for (auto ch : s5){if (ch == 'x'){tmp += "xy";}else{tmp += ch;}}cout << tmp << endl;swap(tmp, s5);cout << s5 << endl;return 0;
}
9、const char* c_str() const; 返回C格式字符串。方便调用C中的接口。
7.string类对象的查找操作
- string substr (size_t pos = 0, size_t len = npos) const; 找子串:返回从pos位置开始,长度为npos的string类。
- size_t find (char c, size_t pos = 0) const; 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置。
- size_t rfind (char c, size_t pos = npos) const; 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置。找不到返回-1。
- size_t find_first_of (const char* s, size_t pos = 0) const; 从字符串pos位置开始从前往后找字符串s中出现的字符,返回该字符在字符串中的位置。
- size_t find_last_of (const char* s, size_t pos = npos) const; 从字符串pos位置开始从后往前找字符串s中出现的字符,返回该字符在字符串中的位置。
- size_t find_first_not_of (const char* s, size_t pos = 0) const; 从字符串pos位置开始从前往后找字符串s中没有出现的字符,返回该字符在字符串中的位置。
- size_t find_last_not_of (const char* s, size_t pos = npos) const; 从字符串pos位置开始从后往前找字符串s中没有出现的字符,返回该字符在字符串中的位置。
int main()
{//suffix:后缀string s1("test.cpp");size_t pos1 = s1.find(".");string suffix1 = s1.substr(pos1);cout << suffix1 << endl; //.cppstring s2("test.cpp.zip");size_t pos2 = s2.rfind(".");string suffix2 = s2.substr(pos2);cout << suffix2 << endl; //.zipstring s3("hello ryc");size_t found = s3.find_first_of("ryc");while (found != string::npos){s3[found] = '*';found = s3.find_first_of("ryc", found + 1);}cout << s3 << endl; //hello ***string str1("/user/bin/man");cout << endl << str1 << "的路径名与文件名如下:" << endl;size_t found1 = str1.find_last_of("/\\");cout << "path:" << str1.substr(0, found1) << endl;cout << "file:" << str1.substr(found1 + 1) << endl;string str2("c:\\windows\\winhelp.exe");cout << endl << str2 << "的路径名与文件名如下:" << endl;size_t found2 = str2.find_last_of("/\\");cout << "path:" << str2.substr(0, found2) << endl;cout << "file:" << str2.substr(found2 + 1) << endl;return 0;
}
8.string类对象的遍历操作
1.下标 + []
int main()
{string s1("hello ryc");for (int i = 0; i < s1.size(); i++){s1[i] += 2;cout << s1[i] << " ";}cout << endl << s1 << endl;return 0;
}
2.迭代器
int main()
{string s1("hello ryc");string::iterator it = s1.begin();while (it != s1.end()){*it += 2;//可以修改cout << *it << " ";++it;}cout << endl << s1 << endl;return 0;
}
3.auto和范围for
int main()
{string s1("hello ryc");//范围for 自动迭代 自动判断结束//底层就是迭代器for (auto ch : s1){ch += 2;//修改ch对s1无影响,ch是它的拷贝cout << ch << " ";}cout << endl << s1 << endl;return 0;
}
int main()
{string s1("hello ryc");//范围for 自动迭代 自动判断结束//底层就是迭代器for (auto& ch : s1){ch += 2;//修改ch对s1无影响,ch是它的拷贝//加上引用即可!cout << ch << " ";}cout << endl << s1 << endl;return 0;
}
1.auto关键字
- 在早期C/C++中auto的含义是:使用auto修饰的变量,是具有自动存储器的局部变量,后来这个不重要了。C++11中,标准委员会变废为宝赋予了auto全新的含义即:auto不再是一个存储类型指示符,而是作为一个新的类型指示符来指示编译器,auto声明的变量必须由编译器在编译时期 推导而得。
- 用auto声明指针类型时,用auto和auto*没有任何区别,但用auto声明引用类型时则必须加&。
- 当在同一行声明多个变量时,这些变量必须是相同的类型,否则编译器将会报错,因为编译器实际只对第一个类型进行推导,然后用推导出来的类型定义其他变量。
- auto不能作为函数的参数,可以做返回值,但是建议谨慎使用。
- auto不能直接用来声明数组。
2.范围for
- 对于一个有范围的集合而言,由程序员来说明循环的范围是多余的,有时候还会容易犯错误。因此C++11中引入了基于范围的for循环。for循环后的括号由冒号“ :”分为两部分:第一部分是范围内用于迭代的变量,第二部分则表示被迭代的范围,自动迭代,自动取数据,自动判断结束。
- 范围for可以作用到数组和容器对象上进行遍历。
- 范围for的底层很简单,容器遍历实际就是替换为迭代器,这个从汇编层也可以看到。
int main()
{int array[] = { 1,2,3,4,5 };for (auto i : array){cout << i << " ";}cout << endl;return 0;
}
三、非成员函数:getline()
istream& getline (istream& is, string& str, char delim); delim:分隔符
istream& getline (istream& is, string& str);
类似C语言中的scanf(“%s”, str),但是其遇到空格会停止;
C++中引入了getline优化了scanf遇到的问题,默认遇到\n才停止,也可以自定义停止字符delim。
#include <iostream>
#include<string>
using namespace std;int main()
{string str;getline(cin, str);size_t pos = str.rfind(' ');string sub = str.substr(pos + 1);cout << sub.size() << endl;
}
相关文章:

string 的介绍及使用
一.string类介绍 C语言中,字符串是以’\0’结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,不太符合OOP的思想,而且底层空间需要用户自己管理&a…...
高等数学的后续课程
1. 高等数学的后续课程 复变函数:研究复数的函数及其性质,包含解析函数、积分理论和应用。偏微分方程:处理涉及多个变量的微分方程,应用于物理、工程等领域。数学分析:更深入地研究极限、连续性、导数和积分等概念&am…...

基于 K8S kubernetes 搭建 安装 EFK日志收集平台
目录 1、在k8s中安装EFK组件 1.1 安装elasticsearch组件 1.2 安装kibana组件 1.3 安装fluentd组件 文档中的YAML文件配置直接复制粘贴可能存在格式错误,故实验中所需要的YAML文件以及本地包均打包至网盘 链接:https://pan.baidu.com/s/15Ryaoa0_…...

浅谈分布式系统
单机架构 单机架构就是只有一台服务器,这台服务器负责所有的工作。 初期,在用户访问量很少,没有对我们的性能、安全等提出很高的要求,而且系统架构简单,无需专业的运维团队,所以选择单机架构是合适的。 当…...
QT 自定义可拖动缩放的无边框窗口,可用于mainmindow, widget
1. 用于拖动,缩放的工具类 “WindowControl.h” #ifndef WINDOWCONTROL_H #define WINDOWCONTROL_H#include <QObject> #include <QRubberBand> #include <QStyleOptionFocusRect> #include <QStylePainter>class RubberBand; class Curs…...

鸿蒙 OS 开发零基础快速入门教程
视频课程: 东西比较多, 这里主要分享一些代码和案例. 开关灯效果案例: 开灯 开关灯效果案例: 关灯 Column 和 Row 的基本用法 Entry Component struct Index {State message: string 张三;build() {// 一行内容Row() {// 一列内容Column() {// 文本内容Text(this.mess…...
yolo介绍
YOLO(You Only Look Once)是一种目标检测算法。 一、主要特点 1. 速度快:YOLO 能够快速处理图像,实现实时目标检测。与其他一些目标检测算法相比,它在处理速度上具有明显优势,可以满足对实时性要求较高的应…...

传输层 II(TCP协议——协议的特点、报文段、连接管理)【★★★★】
(★★)代表非常重要的知识点,(★)代表重要的知识点。 一、TCP 协议的特点 TCP 是在不可靠的 IP 层之上实现的可靠的数据传输协议,它主要解决传输的可靠、有序、无丢失和不重复问题。TCP 是 TCP/IP 体系中非…...
质量小议47 - AI写用例
试着用AI写测试用例 AI替代基础性工作,帮助人思考,将会是更全面、更细致 时替代还是辅助 提问:密码输入框 测试用例评价指标- 功能性 - 可靠性 - 易用性 - 效率- 可维护性 - 可移植性基本思路 - 输入:遵从设计逻辑 和 系…...
etcd 集群搭建与测试指南
etcd 集群搭建与测试指南 一、容器搭建 1. 拉取 etcd 镜像 首先,需要从 Docker Hub 拉取 etcd 的镜像: docker pull quay.io/coreos/etcd:v3.3.12. 创建自定义网络 为了设置容器的固定 IP,需要创建一个自定义网络: docker n…...
写毕业论文用什么软件?分享6款好用的AI论文写作软件网站
撰写毕业论文是一项既重要又具挑战性的任务,尤其是在当今数字化时代,AI写作工具已经成为大学生撰写毕业论文的重要辅助手段。这些工具不仅能够提高写作效率,还能帮助学生生成高质量的文稿。以下是六款备受推荐的AI写毕业论文软件,…...
【技术解析】wx.request 封装:优化小程序网络请求的最佳实践
在当今的小程序开发领域,网络请求是构建动态应用的核心。微信小程序提供的 wx.request API 虽然强大,但在面对复杂业务逻辑时,其直接使用方式可能会带来一系列问题。本文将深入探讨封装 wx.request 的必要性,并提供一套实用的封装…...

9.24 C++ 常成员,运算符重载
//my_string.cpp #include "my_string.h" #include <iostream> #include <cstring>using namespace std;My_string::My_string():size(15){this->ptr new char[size];this->ptr[0] \0; //表示串为空串this->len 0;}//有参构造My_…...
C#设计模式之访问者模式
总目录 前言 在软件构建过程中,由于需求的改变,某些类层次结构中常常需要增加新的行为,如果直接在基类中做这样的更改,将会给子类带来很繁重的变更负担,甚至破坏原有设计。如何在不更改类层次结构的前提下,…...

一次RPC调用过程是怎么样的?
注册中心 RPC(Remote Procedure Call)翻译成中文就是 {远程过程调用}。RPC 框架起到的作用就是为了实现,调用远程方法时,能够做到和调用本地方法一样,让开发人员更专注于业务开发,不用去考虑网络编程等细节…...

鸭脖变“刺客”,啃不起了
撰文|ANGELICA 编辑|ANGELICA 审核|烨 Lydia 声明|图片来源网络。日晞研究所原创文章,如需转载请留言申请开白。 你有多久没吃卤味了? 2020年之后,人们对于几大卤味巨头的关注度正在下降。 …...
力扣 —— 删除有序数组中的重复项
题目思路 两个指针,一个是游标的功能,负责遍历整个数组,一个是定位器的功能,如果有相等的则表示定位器目前指向的元素是重复的,定位器不动,等待游标往下找到不重复的数填充进来,因为游标会遍历…...
rmdir :删除空文件夹
一、命令简介 在 Linux 系统中,rmdir 命令用于删除空目录(文件夹)。 二、命令参数 rmdir 目录 三、命令示例 删除名为 dir1 的空目录: rmdir dir1删除多个空目录: rmdir dir1 dir2 dir3注意事项…...

网络爬虫Request静态页面数据获取
在现代 Web 开发中,HTTP 请求(Request)是与服务器进行通信的核心操作。无论是在前端还是后端开发中,数据的获取、传递以及处理都离不开请求的应用。特别是在静态页面的数据获取中,使用请求可以将页面变得更加动态和互动,从而大大提升用户体验,使得页面内容更加丰富和灵活…...

网页聊天——测试报告——Selenium自动化测试
一,项目概括 1.1 项目名称 网页聊天 1.2 测试时间 2024.9 1.3 编写目的 对编写的网页聊天项目进行软件测试活动,揭示潜在问题,总结测试经验 二,测试计划 2.1 测试环境与配置 服务器:云服务器 ubuntu_22 PC机&am…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法
树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
【python异步多线程】异步多线程爬虫代码示例
claude生成的python多线程、异步代码示例,模拟20个网页的爬取,每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程:允许程序同时执行多个任务,提高IO密集型任务(如网络请求)的效率…...

NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)
文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...