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…...

mysql5.7常用操作命令手册
文章目录 前言一、关闭mysql服务1.mha节点,关闭MHA高可用2.主节点,摘掉vip,停掉mysql服务3.从节点,停掉mysql服务 二、启动mysql1.启动数据库顺序2.主节点,登陆数据库检查主库状态,将主库改成读写状态3.从节点启动配置数据库&…...

前端组件库Element UI 的使用
一、准备工作 1.确保安装了开发软件 VS Code(此处可查阅安装 VS Code教程),确保相关插件安装成功 2.安装Node.js 和创建Vue项目(此处可查阅安装创建教程) 3.成功在VS Code运行一个Vue项目(此处可查阅运行…...

【C++ 基础数学 】2121. 2615相同元素的间隔之和|1760
本文涉及的基础知识点 基础数学 LeetCode2121. 相同元素的间隔之和 难度分:1760 令2165,和此题几乎相等。 给你一个下标从 0 开始、由 n 个整数组成的数组 arr 。 arr 中两个元素的 间隔 定义为它们下标之间的 绝对差 。更正式地,arr[i] 和…...

从手动测试菜鸟,到自动化测试老司机,实现自动化落地
虽然许多伙伴是一个测试老人了,但是基本上所有的测试经验都停留在手工测试方面,对于自动化测试方面的实战经验少之又少。 其实,究其原因:一方面是,自动化方面不求上进,觉得会手工测试就可以了,自…...

docker zookeeper集群启动报错:Cannot open channel to * at election address /ip:3888
下面几点需要注意的: 1、确认在每个$zookeeper_home/data/myid中有对应数字 2、是否关闭防火墙:systemctl stop firewalld,systemctl disable firewalld 3、zoo.cfg中的server需要写成以下形式的: 假如有两台机器,1…...

【Linux探索学习】第一弹——Linux的基本指令(上)——开启Linux学习第一篇
前言: 在进入Linux学习之前,我们首先要先做好以下两点:1、已经基本掌握C语言或C,2、已经配置好了Linux的环境,做完以上两点后我们就开始Linux的学习,今天我们首先要学习的就是Linux中最基础的操作ÿ…...

3.Vue2结合element-ui实现国际化多语言i18n
1.安装vue-i18n npm install vue-i18n8.2.1说明:Vue2使用vue-i18n是8.x,Vue3使用的版本是9.x以上,使用错了会导致报错 2.创建多语言文件 在src/下创建src/lang/langs/zh.js和src/lang/langs/en.js两个文件,里面内容如下&#x…...

整数二分算法和浮点数二分算法
整数二分算法和浮点数二分算法 二分 现实中运用到二分的就是猜数字的游戏 假如有A同学说B同学所说数的大小,B同学要在1~100中间猜中数字65,当B同学每次说的数都是范围的一半时这就算是一个二分查找的过程 二分查找的前提是这个数字序列要有单调性 基…...

智能回收箱的功能和使用步骤介绍
智能回收箱是现代城市环保与资源循环利用领域的一项创新技术,它通过集成各种智能化功能,提高了垃圾回收的效率和准确性,促进了垃圾分类与减量。随着全球对环境保护意识的增强和智慧城市概念的推广,智能回收箱的发展前景非常广阔&a…...

Remix在SPA模式下,出现ErrorBoundary错误页加载Ant Design组件报错,不能加载样式的问题
Remix是一个既能做服务端渲染,又能做单页应用的框架,如果想做单页应用,又想学服务端渲染,使用Remix可以降低学习成本。最近,在学习Remix的过程中,遇到了在SPA模式下与Ant Design整合的问题。 我用Remix官网…...