C++ string类详解

⭐️ string

string 是表示字符串的字符串类,该类的接口与常规容器的接口基本一致,还有一些额外的操作 string 的常规操作,在使用 string 类时,需要使用 #include <string> 以及 using namespace std;

帮助文档:https://cplusplus.com/reference/string/string/string/

🌟 std::string::string 构造函数(constructor)

序号构造函数功能
1️⃣string()默认拷贝:构造空的string类对象,即空字符串,默认第一个字符位置是'\0',为了兼容c
2️⃣string(const string& str)拷贝构造
3️⃣string(const string& str , size_t pos , size_t len = npos)拷贝构造的重载,从字符串 pos 位置开始拷贝,拷贝 len 个字符
4️⃣string(const char * s)使用 c_string 来初始化 string 类对象
5️⃣string(const char * s , size_t n)s 指向的字符串中复制前 n 个字符
6️⃣string(size_t n , char c)使用 nc 字符来填充字符串
7️⃣template <class InputIterator> string (InputIterator first , InputIterator last)复制一个迭代器序列的字符串 [first , last)
#include <iostream>
#include <string>
using namespace std;int main() {string s1;	// 默认构造 第一个字符是 `\0`cout << s1 << endl;/*调用构造本身的写法应该是:string s2("hello world");但是为什么可以这样写呢? string s2 = "hello world";因为当构造函数是单参的时候,是支持隐式类型转换的。这里本质上先构造再拷贝构造,但是编译器通常会优化为直接构造。若不希望隐式类型的转换可以在构造函数前添加 explicit 关键字*/string s2 = "hello world"; // 使用c字符串构造一个string类对象cout << s2 << endl;string s3(s2);	// 拷贝构造cout << s3 << endl;string s4(s3, 6, 5);  // 拷贝构造的重载 从下标6位置开始拷贝 拷贝5个字符cout << s4 << endl;string s5("hello" , 3); // 拷贝 `hello` 前3个字符cout << s5 << endl;string s6(10 , 'a'); // 使用 10个 `a` 填充对象cout << s6 << endl;string s7(s6.begin() , s6.end()); // 迭代器序列初始化cout << s7 << endl;return 0;
}

output:

在这里插入图片描述


ps: npos 原型:static const size_t npos = -1;npos 的访问:string::npos。无符号的 -1 相当于是整型的最大值,若当不传这个参数时, 或者 len 大于后面剩余字符的长度,那么使用默认参数 npos都是相当于 直到字符串的结束。[ 返回 ]

在这里插入图片描述


🌟 std::string::operator= 赋值重载

序号函数名称功能
1️⃣string& operator= (const string& str)用一个新的 string 对象替换当前 string 对象的内容
2️⃣string& operator= (const char * s)用一个c的字符串替换当前 string 对象内容
3️⃣string& operator= (char c)使用一个字符替换当前 string 对象的内容
#include <iostream>
#include <string>
using namespace std;int main() {string s1 = "hello world";
// 1.string temp = "ccc";s1 = temp;cout << s1 << endl;
// 2.s1 = "hhhh";cout << s1 << endl;
// 3.s1 = 'a';cout << s1 << endl;return 0;
}

output:

在这里插入图片描述


🌟 元素的访问

序号函数名称功能
1️⃣char& operator[] (size_t pos)返回当前 string 对象中 pos 位置字符的引用
2️⃣const char& operator[](size_t pos) const返回当前 const string 对象中 pos 位置字符的引用
3️⃣char& at (size_t pos)返回当前 string 对象中 pos 位置字符的引用
4️⃣const char& at (size_t pos) const返回当前 const string 对象中 pos 位置字符的引用
5️⃣char& back()返回当前 string 对象最后一个字符的引用
6️⃣const char& back() const返回当前 const string 对象最后一个字符的引用
7️⃣char& front()返回当前 string 对象第一个字符的引用
8️⃣const char& front() const返回当前 const string 对象第一个字符的引用

ps: at[] 的行为是一样的,函数都会检查 pos 是否是合法位置,若不是,[] 是断言错误,而 at 是抛异常。

ps: back == [xx.size() - 1]front == [0]

#include <iostream>
#include <string>
using namespace std;int main() {const string s1 = "hello";for (size_t i = 0; i < s1.size(); i++) {cout << s1[i] << " ";}cout << endl;string s2 = "world";for (size_t i = 0; i < s2.size(); i++) {s2[i]++;cout << s2[i] << " ";}cout << endl;string s3 = "hello world";cout << s3.back() << s3[s3.size() - 1] << endl;cout << s3.front() << s3[0] << endl;cout << s3.at(4) << endl;return 0;
}

output:

在这里插入图片描述


🌟 元素的长度

序号函数名称功能
1️⃣size_t size() const返回 string 对象实际字符的长度
2️⃣size_t length() const返回 string 对象实际字符的长度
#include <iostream>
#include <string>
using namespace std;int main() {string s = "hello world";cout << s.size() << endl;	// 11cout << s.length() << endl;	// 11return 0;
}

🌟 string 迭代器

序号函数名称功能
1️⃣iterator begin()返回一个迭代器,该迭代器指向 string 对象的第一个字符
2️⃣const_iterator begin() const返回一个迭代器,该迭代器指向 const string 对象的第一个字符
3️⃣iterator end()返回一个迭代器,该迭代器指向 string 对象最后一个实际字符的下一个位置
4️⃣const_iterator end() const返回一个迭代器,该迭代器指向 const string 对象最后一个实际字符的下一个位置
5️⃣reverse_iterator rbegin()返回一个反向迭代器,该迭代器指向 string 对象最后一个实际字符的位置
6️⃣const_reverse_iterator rbegin() const返回一个反向迭代器,该迭代器指向 const string 对象最后一个实际字符的位置
7️⃣reverse_iterator() rend()返回一个反向迭代器,该迭代器指向 string 对象第一个字符的前一个位置
8️⃣const_reverse_iterator() rend() const返回一个反向迭代器,该迭代器指向 const string 对象第一个字符的前一个位置

ps: [ begin() , end() )( rend() , rbegin() ]

#include <iostream>
#include <string>
using namespace std;int main() {string s = "hello world";for (string::iterator it = s.begin(); it != s.end(); it++) {cout << *it << " ";}// output: h e l l o   w o r l dcout << endl;// 自动迭代 自动判断结束// 范围for 本质上调用的也是迭代器for (auto val : s) {cout << val << " ";}// output: h e l l o   w o r l dcout << endl;for (string::reverse_iterator it = s.rbegin(); it != s.rend(); it++) {cout << *it << " ";}// output: d l r o w   o l l e hcout << endl;// const const string s2 = "nihao";string::const_iterator it = s2.begin();while (it != s2.end()) {cout << *it << " ";it++;}// output: n i h a ocout << endl;string::const_reverse_iterator rit = s2.rbegin();while (rit != s2.rend()) {cout << *rit << " ";rit++;}// output: o a h i nreturn 0;
}

output:

在这里插入图片描述


🌟 string 对象修改

序号函数名称功能
1️⃣void push_back (char c)在当前 string 对象的末尾追加一个 c 字符
2️⃣string& append (const string& str)在当前 string 对象的末尾追加一个 const string str 对象
3️⃣string& append (const string& str , size_t subpos , size_t sublen)在当前 string 对象的末尾追加一个 const string str 对象的子串,从 subpos 位置开始,拷贝 sublen 个字符过去
类似上面构造函数的 npos 用法
4️⃣string& append (const char* s);在当前 string 对象的末尾追加一个 c_string 字符串
5️⃣template <class InputIterator> string& append (InputIterator first , InputIterator last) 追加一个迭代器序列的字符串 [first , last)
#include <iostream>
#include <string>
using namespace std;int main() {string s = "hello";s.push_back('-');cout << s << endl;s = "hello";string temp = " world";s.append(temp);cout << s << endl;string s2 = "hello";string temp2 = " world";s2.append(temp2 , 0 , 3);cout << s2 << endl;string s3 = "hello";s3.append(" world");cout << s3 << endl;string s4 = "hello";s4.append(s4.begin(), s4.end());cout << s4 << endl;string s5 = "hello";s5.append(s5.rbegin() , s5.rend());cout << s5 << endl;return 0;
}

output:

在这里插入图片描述


std::string::operator+= 运算符重载

序号函数名称功能
6️⃣string& operator+= (const string& str);在当前 string 对象的末尾追加一个 const string str 对象
7️⃣string& operator+= (const char* s);在当前 string 对象的末尾追加一个 c_string 字符串
8️⃣string& operator+= (char c);在当前 string 对象的末尾追加一个 c 字符
#include <iostream>
#include <string>
using namespace std;int main() {string s = "he";s += 'l';s += 'l';s += "o ";string temp = "world";s += temp;cout << s << endl;// output: hello worldreturn 0;
}

🌟 元素的容量

序号函数名称功能
1️⃣size_t capacity() const返回当前 string 对象的容量大小
2️⃣void reserve (size_t n = 0)改变当前 string 对象的容量为 n
3️⃣void resize (size_t n)将当前 string 对象的 size() 调整为 n 并初始化为 '\0'
4️⃣void resize (size_t n , char c)将当前 string 对象的 size() 调整为 n 并初始化为 c
5️⃣void clear();删除当前 string 对象的所有内容,size() = 0
6️⃣bool empty() const若当前 string 对象为空返回 true,否则返回 false

ps: reserve 是改变容量,而 resize 是改变 size() + 初始化,resizen 传的比 string 的大小还小,则就是删除。

#include <iostream>
#include <string>
using namespace std;int main() {string s = "hello";cout << s.capacity() << endl;s.reserve(100);cout << s.capacity() << endl;cout << s.size() << endl; // 5string s2 = "hello world";s2.resize(5);cout << s2.size() << endl;	// 100cout << s2 << endl;s2.clear();cout << s2.empty() << endl;return 0;
}

output:

在这里插入图片描述


🌟 std::string::insert 插入

在这里插入图片描述


ps: 需要的查文档即可,效率不高很少用。

🌟 std::string::erase 删除

在这里插入图片描述


🌟 std::string::c_str 返回c的字符串

序号函数名称功能
1️⃣const char* c_str() const返回c的字符串使用 '\0' 结尾

🌟 查找

序号函数名称功能
1️⃣size_t find (char c , size_t pos = 0) const从当前 string 对象的 pos 位置开始查找 c 字符,返回这个字符第一次出现的位置,否则返回 string::npos
2️⃣string substr (size_t pos = 0 , size_t len = npos) const返回当前对象 pos 位置开始的 len 个字符的子串
#include <iostream>
#include <string>
using namespace std;int main() {string s = "hello world";size_t res = s.find('w' , 0);if (res != string::npos) {cout << s.substr(res) << endl;	// world}return 0;
}
序号函数名称功能
3️⃣size_t rfind (char c , size_t pos = npos) const从当前 string 对象的 pos 位置从后向前开始查找 c 字符,返回这个字符最后一次出现的位置,否则返回 string::npos

🌟 其他

序号函数名称功能
1️⃣istream& getline (istream& is , string& str , char delim)输入一行字符遇到 delim 终止
2️⃣istream& getline (istream& is , string& str)输入一行字符遇到 \n 终止
3️⃣string to_string (int val)返回一个 valstring 对象
4️⃣int stoi (const string& str, size_t* idx = 0, int base = 10)字符串转整数。 idx 通常都为 nullptrbase 代表进制

ps: to_string 支持的转换类型

在这里插入图片描述


ps: string 可以转换为的类型

在这里插入图片描述


#include <iostream>
#include <string>
using namespace std;int main() {int val = 10;string s_val = to_string(val);cout << s_val << endl;	 // 10val = stoi(s_val);cout << val << endl;	// 10return 0;
}

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

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

相关文章

【HarmonyOS】服务卡片 API6 JSUI跳转不同页面

【引言】 “JS卡片支持为组件设置action&#xff0c;包括router事件和message事件&#xff0c;其中router事件用于应用跳。若设置router事件&#xff0c;则action属性值为"router"&#xff1b;abilityName为卡片提供方应用的跳转目标Ability名&#xff1b;params中的…

Spring Security6 最新版配置该怎么写,该如何实现动态权限管理

Spring Security 在最近几个版本中配置的写法都有一些变化&#xff0c;很多常见的方法都废弃了&#xff0c;并且将在未来的 Spring Security7 中移除&#xff0c;因此又补充了一些新的内容&#xff0c;重新发一下&#xff0c;供各位使用 Spring Security 的小伙伴们参考。 接下…

LeetCode--HOT100题(33)

目录 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09;题目接口解题思路代码 PS: 题目描述&#xff1a;148. 排序链表&#xff08;中等&#xff09; 给你链表的头结点 head &#xff0c;请将其按 升序 排列并返回 排序后的链表 。 LeetCode做题链接&#xff1…

VR/AR眼镜方案,MTK联发科平台智能眼镜安卓主板设计方案

随着人工智能在不同领域的逐渐深入&#xff0c;人们对一款产品的需求不再局限于某种单一的功能或单一场景&#xff0c;尤其是在工业医疗等专业领域&#xff0c;加快数字化转型才能实现产业的升级。 AR智能眼镜&#xff0c;是一个可以让现场作业更智能的综合管控设备。采用移动…

Hlang--用Python写个编程语言-函数与基本数据结构实现

文章目录 前言语法表述解析器修改词法解析函数节点函数节点解析List的解析实现解释器节点函数操作String和List处理总结前言 okey,经过一段时间的努力,接下来要实现的是函数。当然还有对应的基本数据结构,那么之后的话,我们的工作就开始进一步转换了。 那么在这块我们要实…

vscode搭建java开发环境

一、配置extensions环境变量VSCODE_EXTENSIONS 该环境变量路径下的存放安装组件&#xff1a; 二、setting配置文件 {"java.jdt.ls.java.home": "e:\\software\\jdk\\jdk17",// java运行环境"java.configuration.runtimes": [{"name":…

vscode远程连接Linux失败,提示过程试图写入的管道不存在(三种解决办法)

vscode报错如下&#xff1a; 一、第一种情况 原因是本地的known_hosts文件记录服务器信息与现服务器的信息冲突了&#xff0c;导致连接失败。 解决方案就是把本地的known_hosts的原服务器信息全部删掉&#xff0c;然后重新连接。 二、第二种情况 在编写配置文件config时&…

批量提取文件名到excel,详细的提取步骤

如何批量提取文件名到excel&#xff1f;我们的电脑中可能存储着数量非常多的电子文件&#xff0c;现在需要快速将这些文件的名称全部提取到Excel中。虽然少量数据可以通过复制粘贴的方式轻松完成&#xff0c;但是对于上万个数据而言&#xff0c;复制粘贴都是行不通的&#xff0…

XQuery创建BaseX数据库实例

XQuery创建BaseX数据库实例 文章目录 XQuery创建BaseX数据库实例1、准备工作2、demo目录结构3、IDEA配置BaseX4、工具类BaseXClient5、Example 1、准备工作 开发工具&#xff1a; IDEAOxygen 技术&#xff1a; JavaBaseXXpathXquery BaseX需要阅读的文档&#xff1a; htt…

centos安装elasticsearch7.9

安装es 下载elasticsearch安装包解压安装包,并修改配置文件解压进入目录修改配置文件 添加用户&#xff0c;并修改所有者切换用户&#xff0c;运行es如何迁移旧版本的数据 下载elasticsearch安装包 下载地址如下&#xff0c;版本号可以替换成自己想要的。 这里需要注意一点&am…

[Java优选系列第2弹]SpringMVC入门教程:从零开始搭建一个Web应用程序

想和你们分享我眼里的代码世界&#x1f5fa;️ 优选系列持续更新中&#x1f4ab; 一直在等你&#xff0c;你终于来啦&#x1f496; 绿色代表解释说明 黄色代表重点 红色代表精髓 SpringMVC是一个基于Java的Web框架&#xff0c;它使用了MVC&…

AI问答:JSBridge / WebView 与 Native 通信

一、理解JSBridge JSBridge是一种连接JavaScript和Native代码的桥梁&#xff0c;它提供了一种方法&#xff0c;使得JavaScript可以直接调用Native的代码&#xff0c;同时使得Native的代码也能直接调用JavaScript的方法&#xff0c;从而实现了JavaScript和Native之间的相互调用和…

LeetCode——二叉树篇(四)

刷题顺序及思路来源于代码随想录&#xff0c;网站地址&#xff1a;https://programmercarl.com 二叉树的定义及创建见&#xff1a; LeetCode ACM模式——二叉树篇&#xff08;一&#xff09;_要向着光的博客-CSDN博客 目录 101. 对称二叉树 递归 使用队列 100. 相同的树 …

无涯教程-Perl - setnetent函数

描述 该函数应在第一次调用getnetent之前调用。 STAYOPEN参数是可选的,在大多数系统上未使用。当getnetent()从网络数据库的下一行检索信息时,setnetent会将枚举设置(或重置)为主机条目集的开头。 语法 以下是此函数的简单语法- setnetent STAYOPEN返回值 此函数不返回任何…

如何使用Redis实现附近商家查询

导读 在日常生活中&#xff0c;我们经常能看见查询附近商家的功能。 常见的场景有&#xff0c;比如你在点外卖的时候&#xff0c;就可能需要按照距离查询附近几百米或者几公里的商家。 本文将介绍如何使用Redis实现按照距离查询附近商户的功能&#xff0c;并以SpringBoot项目…

H13-922题库 HCIP-GaussDB-OLAP V1.5

**H13-922 V1.5 GaussDB(DWS) OLAP题库 华为认证GaussDB OLAP数据库高级工程师HCIP-GaussDB-OLAP V1.0自2019年10月18日起&#xff0c;正式在中国区发布。当前版本V1.5 考试前提&#xff1a; 掌握基本的数据库基础知识、掌握数据仓库运维的基础知识、掌握基本Linux运维知识、…

Git命令详解

1 常用命令 1&#xff09;初始化本地仓库 git init <directory> 是可选的&#xff0c;如果不指定&#xff0c;将使用当前目录。 2&#xff09;克隆一个远程仓库 git clone <url> 3&#xff09;添加文件到暂存区 git add <file> 要添加当前目录中的所…

【Java】2021 RoboCom 机器人开发者大赛-高职组(初赛)题解

7-1 机器人打招呼 机器人小白要来 RoboCom 参赛了&#xff0c;在赛场中遇到人要打个招呼。请你帮它设置好打招呼的这句话&#xff1a;“ni ye lai can jia RoboCom a?”。 输入格式&#xff1a; 本题没有输入。 输出格式&#xff1a; 在一行中输出 ni ye lai can jia Robo…

手把手教你制作印刷包装小程序商城

印刷包装行业越来越受到人们的重视&#xff0c;为了更好地满足消费者的需求&#xff0c;搭建一个专属的小程序商城是一种不错的选择。那么&#xff0c;接下来就让我们一起来学习如何搭建印刷包装小程序商城吧&#xff01; 第一步&#xff1a;登录【乔拓云】网后台&#xff0c;进…