浅谈C++|STL之string篇

news2025/1/19 14:17:54

在这里插入图片描述

一.string的基本概念

本质

string是C++风格的字符串,而string本质是一个字符串

string和char * 区别

  • char * 是一个指针
  • string是一个类,类内部封装了char *,管理这个字符串,是一个char * 型容器。

特点

string类内部封装了很多成员方法

例如:查找find,拷贝copy,删除delete替换replace,插入insert
string管理char*所分配的内存,不用担心复制越界和取值越界等,由类内部进行负责

二.string构造函数

以下是std::string的构造函数原型整理成表格的形式:

构造函数描述
string()默认构造函数
string(const char* s)使用C风格字符串构造函数
string(const char* s, size_t n)使用C风格字符串和长度构造函数
string(size_t n, char c)使用重复字符构造函数
string(const string& str)拷贝构造函数
string(string&& str) noexcept移动构造函数
template string(InputIterator first, InputIterator last)使用迭代器范围构造函数
string(initializer_list ilist)使用初始化列表构造函数
#include <iostream>
#include <string>
using namespace std;
int main() {
	//默认构造函数
	string str1;
	string str2("使用C风格字符串构造函数");
	string str3("使用C风格字符串和长度构造函数", 5);
	string str4(10, 'a');
	string str = "拷贝构造函数";
	string str5(str);
	string&& str6 = move("移动构造函数");
	str = "使用迭代器范围构造函数";
	string str7(str.begin(), str.end());
	string str8[2] = { "使用初始化", "列表构造函数" };
	cout << "wetr";
	cout << str1 << endl;
	cout << str2 << endl;
	cout << str3 << endl;
	cout << str4 << endl;
	cout << str5 << endl;
	cout << str6 << endl;
	cout << str7 << endl;
	cout << str8[1]<< str8[2] << endl;
	return 0;
}

![2023-09-01T01:46:05.png][1]

二.string的赋值操作

以下是std::string的赋值操作函数原型整理成表格的形式:

函数原型描述
string& operator=(const string& str)赋值运算符重载:从另一个字符串赋值
string& operator=(string&& str) noexcept赋值运算符重载:移动赋值
string& operator=(const char* s)赋值运算符重载:从C风格字符串赋值
string& operator=(char c)赋值运算符重载:从单个字符赋值
string& operator=(initializer_list<char> ilist)赋值运算符重载:从初始化列表赋值
string& assign(const string& str)成员函数:从另一个字符串赋值
string& assign(string&& str) noexcept成员函数:移动赋值
string& assign(const char* s)成员函数:从C风格字符串赋值
string& assign(const char* s, size_t n)成员函数:从C风格字符串和长度赋值
string& assign(size_t n, char c)成员函数:使用重复字符赋值
string& assign(initializer_list<char> ilist)成员函数:从初始化列表赋值
string& assign(const_iterator first, const_iterator last)成员函数:使用迭代器范围赋值
#include <iostream>
#include <string>
using namespace std;
int main() {
	string str1;
	str1 = "从另一个字符串赋值";
	cout << str1 << endl;
	str1 = move("移动赋值");
	cout << str1 << endl;
	str1 = "从C风格字符串赋值";
	cout << str1 << endl;
	string str = "  使用迭代器范围赋值";
	str1.assign(str.begin()+2, str.end());
	cout << str1 << endl;
	return 0;
}

![2023-09-01T02:02:34.png][2]

三.string拼接操作

以下是std::string的字符串拼接操作函数原型整理成表格的形式:

函数原型描述
string operator+(const string& lhs, const string& rhs)运算符重载:字符串与字符串的拼接
string operator+(const string& lhs, const char* rhs)运算符重载:字符串与C风格字符串的拼接
string operator+(const char* lhs, const string& rhs)运算符重载:C风格字符串与字符串的拼接
string operator+(const string& lhs, char rhs)运算符重载:字符串与单个字符的拼接
string operator+(char lhs, const string& rhs)运算符重载:单个字符与字符串的拼接
string& append(const string& str)成员函数:追加拼接另一个字符串
string& append(const string& str, size_t subpos, size_t sublen)成员函数:从另一个字符串的指定位置截取指定长度后进行拼接
string& append(const char* s)成员函数:追加拼接C风格字符串
string& append(const char* s, size_t n)成员函数:追加拼接C风格字符串的指定长度
string& append(size_t n, char c)成员函数:追加拼接指定数量的重复字符
string& append(initializer_list<char> ilist)成员函数:追加拼接初始化列表中的字符
#include <iostream>
#include <string>
using namespace std;
int main() {
	string str;
	string str1 = "01234567";
	str += "hello";
	str += string("word");
	str += (string("  word") + "20  ");
	str.append(str1, 5, 2);
	cout << str;
	return 0;
}

四.string的查找和替换

下面是关于std::string查找和替换的常用函数原型:

查找相关函数:

函数原型描述
size_t find(const string& str, size_t pos = 0) const noexcept;在字符串中查找另一个字符串的位置
size_t find(const char* s, size_t pos = 0) const;在字符串中查找C风格字符串的位置
size_t find(char c, size_t pos = 0) const noexcept;在字符串中查找字符的位置
size_t rfind(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找另一个字符串的位置
size_t rfind(const char* s, size_t pos = npos) const;在字符串中从后往前查找C风格字符串的位置
size_t rfind(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找字符的位置
size_t find_first_of(const string& str, size_t pos = 0) const noexcept;在字符串中查找第一个匹配另一个字符串中任意字符的位置
size_t find_first_of(const char* s, size_t pos = 0) const;在字符串中查找第一个匹配C风格字符串中任意字符的位置
size_t find_first_of(char c, size_t pos = 0) const noexcept;在字符串中查找第一个匹配字符的位置
size_t find_last_of(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个匹配另一个字符串中任意字符的位置
size_t find_last_of(const char* s, size_t pos = npos) const;在字符串中从后往前查找第一个匹配C风格字符串中任意字符的位置
size_t find_last_of(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个匹配字符的位置
size_t find_first_not_of(const string& str, size_t pos = 0) const noexcept;在字符串中查找第一个不匹配另一个字符串中任意字符的位置
size_t find_first_not_of(const char* s, size_t pos = 0) const;在字符串中查找第一个不匹配C风格字符串中任意字符的位置
size_t find_first_not_of(char c, size_t pos = 0) const noexcept;在字符串中查找第一个不匹配字符的位置
size_t find_last_not_of(const string& str, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个不匹配另一个字符串中任意字符的位置
size_t find_last_not_of(const char* s, size_t pos = npos) const;在字符串中从后往前查找第一个不匹配C风格字符串中任意字符的位置
size_t find_last_not_of(char c, size_t pos = npos) const noexcept;在字符串中从后往前查找第一个不匹配字符的位置

替换相关函数:

函数原型描述
string& replace(size_t pos, size_t len, const string& str);替换指定位置和长度的子字符串为另一个字符串
string& replace(size_t pos, size_t len, const char* s);替换指定位置和长度的子字符串为C风格字符串
string& replace(size_t pos, size_t len, const char* s, size_t n);替换指定位置和长度的子字符串为C风格字符串的指定长度
string& replace(size_t pos, size_t len, size_t n, char c);替换指定位置和长度的子字符串为指定数量的重复字符
string& replace(iterator first, iterator last, const string& str);替换迭代器范围内的子字符串为另一个字符串
string& replace(iterator first, iterator last, const char* s);替换迭代器范围内的子字符串为C风格字符串
string& replace(iterator first, iterator last, const char* s, size_t n);替换迭代器范围内的子字符串为C风格字符串的指定长度
string& replace(iterator first, iterator last, size_t n, char c);替换迭代器范围内的子字符串为指定数量的重复字符
#include <iostream>
#include <string>
using namespace std;
int main() {
	string str = "1234578912345789";
	int a = str.find("78");
	cout << a << endl;
	a = str.rfind("78");
	cout << a << endl;
	//从下标1开始的三个字符替换成abcd
	str.replace(1, 3, "abcd");
	cout << str << endl;
	return 0;
}

![2023-09-01T02:19:00.png][3]

五.string的字符串比较

下面是关于std::string比较的常用函数原型:

函数原型描述
int compare(const string& str) const noexcept;比较字符串和另一个字符串
int compare(size_t pos, size_t len, const string& str) const;比较字符串的子串和另一个字符串
int compare(const char* s) const;比较字符串和C风格字符串
int compare(size_t pos, size_t len, const char* s) const;比较字符串的子串和C风格字符串
int compare(size_t pos, size_t len, const char* s, size_t n) const;比较字符串的子串和指定长度的C风格字符串

上述函数通过返回整数值来表示比较的结果,其返回值的含义如下:

  • 返回值 < 0 表示当前字符串小于目标字符串。

  • 返回值 > 0 表示当前字符串大于目标字符串。

  • 返回值 = 0 表示当前字符串等于目标字符串。

    #include
    #include
    using namespace std;
    int main() {
    string str = “1234578912345789”;
    //从0下标开始的6个字符的子串,后一个的字串比较
    int m=str.compare(0,6, “12345789”, 6);
    cout << m << endl;
    return 0;
    }

六.string字符串存取

下面是关于std::string字符串存取的常用函数原型:

函数原型描述
char& operator[](size_t pos);访问字符串中指定位置的字符
const char& operator[](size_t pos) const;访问字符串中指定位置的字符(const版本)
char& at(size_t pos);访问字符串中指定位置的字符,带范围检查
const char& at(size_t pos) const;访问字符串中指定位置的字符,带范围检查(const版本)
char& front();访问字符串的第一个字符
const char& front() const;访问字符串的第一个字符(const版本)
char& back();访问字符串的最后一个字符
const char& back() const;访问字符串的最后一个字符(const版本)
const char* data() const noexcept;返回字符串数据的指针
const char* c_str() const noexcept;返回以空字符结尾的字符串的指针(C风格字符串)
const char* data() const noexcept;返回字符串数据的指针
const char* c_str() const noexcept;返回以空字符结尾的字符串的指针(C风格字符串)

这些函数允许您对std::string对象进行字符的存取操作,可以直接访问特定位置的字符,或者获取字符串的首尾字符。data()c_str()函数还可以返回字符串数据的指针(以及以空字符结尾的C风格字符串的指针),方便与C语言接口进行交互操作。请注意,在只读的场景下使用at()函数可以提供范围检查,避免越界访问。

七.string的插入和删除

下面是关于std::string插入和删除字符串的常用函数原型:

函数原型描述
string& insert(size_t pos, const string& str);在指定位置插入另一个字符串
string& insert(size_t pos, const string& str, size_t subpos, size_t sublen);在指定位置插入另一个字符串的子串
string& insert(size_t pos, const char* s);在指定位置插入C风格字符串
string& insert(size_t pos, const char* s, size_t n);在指定位置插入指定长度的C风格字符串
string& insert(size_t pos, size_t n, char c);在指定位置插入指定数量的字符
iterator insert(iterator p, char c);在指定位置插入单个字符
iterator insert(iterator p, size_t n, char c);在指定位置插入指定数量的字符
iterator insert(iterator p, InputIt first, InputIt last);在指定位置插入迭代器范围的字符
template <class InputIt> void insert(iterator p, InputIt first, InputIt last);在指定位置插入迭代器范围的字符
template <class InputIt> void insert(iterator p, initializer_list<typename InputIt::value_type> ilist);在指定位置插入初始化列表的字符
string& erase(size_t pos = 0, size_t len = npos);删除字符串的子串
iterator erase(iterator p);删除指定位置的字符
iterator erase(iterator first, iterator last);删除迭代器范围内的字符

这些插入和删除函数允许您在std::string对象中插入或删除字符串内容。通过这些函数,您可以在指定位置插入字符串、字符或字符范围,也可以删除字符串子串、指定位置的字符或一段字符范围。这些函数提供了灵活的方式来操作字符串,满足不同场景下的需求。

八.获得string的子串

以下是使用substr函数获取字符串子串的表格总结:

函数原型描述
string substr(size_t pos = 0, size_t len = npos) const;获取从指定位置开始的一段子串

示例:

std::string str = "Hello, World!";
std::string sub1 = str.substr(7);        // "World!"
std::string sub2 = str.substr(0, 5);     // "Hello"
std::string sub3 = str.substr(7, 5);     // "World"

使用substr函数,您可以方便地获得std::string的子串,通过指定起始位置和长度参数来进行操作。

九.函数接口

序号函数接口功能描述
1push_back©在字符串的末尾添加字符 c
2pop_back()删除字符串的最后一个字符
3resize(n)调整字符串的大小为 n
4resize(n, c)调整字符串的大小为 n,并将新增的元素初始化为字符 c
5front()返回字符串的第一个字符
6back()返回字符串的最后一个字符
7find_first_of(str)在字符串中查找字符串 str 中的任意字符第一次出现的位置
8find_first_not_of(str)在字符串中查找字符串 str 中的任意字符第一次不出现的位置
9find_last_of(str)在字符串中从后往前查找字符串 str 中的任意字符最后一次出现的位置
10find_last_not_of(str)在字符串中从后往前查找字符串 str 中的任意字符最后一次不出现的位置
11toLowerCase()将字符串中的字母全部转换为小写
12toUpperCase()将字符串中的字母全部转换为大写
13at(n)返回字符串中索引为 n 的字符
14operator[] (n)返回字符串中索引为 n 的字符
15substr(pos)返回从位置 pos 开始到字符串末尾的子字符串
16compare(pos, len, str)将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 比较
17getline(input_stream, str, delimiter)从输入流 input_stream 中读取一行文本,并将结果存储到字符串 str 中
18stoi(str)将字符串 str 转换为整数值
19stol(str)将字符串 str 转换为长整数值
20stof(str)将字符串 str 转换为浮点数值
21to_string(value)将值 value 转换为字符串
22find_last_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 第一次出现的位置
23find_last_not_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 第一次不出现的位置
24replace(pos, len, newstr, newlen)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串
25find_first_of(str, pos)在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次出现的位置
26find_first_not_of(str, pos)在字符串中从位置 pos 开始查找字符串 str 中的任意字符第一次不出现的位置
27compare(pos, len, str, subpos, sublen)将字符串中从位置 pos 开始的长度为 len 的子字符串与字符串 str 中从位置 subpos 开始的长度为 sublen 的子字符串进行比较
28replace(pos, len, str)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为字符串 str
29capacity()返回字符串当前能够容纳的字符数
30reserve(n)将字符串的容量设置为至少为 n 个字符
31shrink_to_fit()将字符串的容量调整为与字符串的长度相匹配,以节省内存空间
32find_last_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次出现的位置
33find_last_not_of(str, pos)在字符串中从位置 pos 开始从后往前查找字符串 str 中的任意字符最后一次不出现的位置
34replace(pos, len, newstr)将字符串中从位置 pos 开始的长度为 len 的子字符串替换为新的字符串
35replace(iterator1, iterator2, newstr)将迭代器 iterator1 和 iterator2 之间的子字符串替换为新的字符串
36copy(char_array, len, pos)将字符串中从位置 pos 开始的长度为 len 的子字符串复制到字符数组 char_array 中
37find_if(predicate)在字符串中查找满足谓词函数 predicate 的第一个字符的位置
38rfind(str)在字符串中从后往前查找子字符串 str 并返回第一次出现的位置
39rfind(str, pos)在字符串中从位置 pos 开始从后往前查找子字符串 str 并返回第一次出现的位置
40replace_if(predicate, newstr)将字符串中满足谓词函数 predicate 的字符替换为新的字符串

请注意,这里的表格仅提供了功能描述的简要介绍,具体的函数行为和参数要求请查阅官方文档以获取详细信息。

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

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

相关文章

Unity技术手册-UGUI零基础详细教程-Canvas详解

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列 &#x1f449;关于作者 专注于Android/Unity和各种游…

1275MPaMJ螺纹螺栓 最新标准 学习记录

声明 本文是学习GB-T 42850-2023 1275MPaMJ螺纹螺栓. 而整理的学习笔记,分享出来希望更多人受益,如果存在侵权请及时联系我们 10 min&#xff5e;15 min。 A.1.5.8 水冲洗 表面清理后迅速将零件放在21℃~93℃自来水中冲洗&#xff0c;自来水应符合GB5749 的要求。 A.1.6 表…

【qiankun乾坤】从0到1搭建微前端

微前端是一种将一个大型单体应用拆分成多个小型应用的架构方式。它可以让不同的团队独立开发部署自己的应用,同时这些应用可以集成到一个统一的底座应用中,对用户来说就是一个完整的应用。 qiankun 是阿里开源的一个微前端实现框架,可以帮助我们比较容易地实现微前端架构。 下…

Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory

文章目录 参考博客&#xff1a; Linux中执行bash脚本报错/bin/bash^M: bad interpreter: No such file or directory 首先在此对这位博主表示感谢。 运行bash脚本会出现两个文件&#xff0c;1037.err和1037.out。 1037.err的文件内容如下&#xff1a; /data/home/user12/.lsbat…

5.11.Webrtc接口的设计原理

在上节课中呢&#xff0c;我向你介绍了web rtc的接口宏&#xff0c;那有很多同学会产生疑问啊&#xff0c;那觉得web rtc为什么要把接口设计的这么复杂&#xff1f;还非要通过宏来实现一个代理类&#xff0c;再通过代理类来调用到web rtc内部。 那为什么要这么设计呢&#xf…

Vulnhub系列靶机---HarryPotter-Fawkes-哈利波特系列靶机-3

文章目录 信息收集主机发现端口扫描dirsearch扫描gobuster扫描 漏洞利用缓冲区溢出edb-debugger工具msf-pattern工具 docker容器内提权tcpdump流量分析容器外- sudo漏洞提权 靶机文档&#xff1a;HarryPotter: Fawkes 下载地址&#xff1a;Download (Mirror) 难易程度&#xff…

SpringBoot/SpringCloud开源项目,快速开发提高效率80%

前言 SpringBoot 是一个非常流行的 Java 框架&#xff0c;它可以帮助开发者快速构建应用程序。他不仅继承了 Spring 框架原有的优秀特性&#xff0c;而且还通过简化配置来进一步简化了 Spring 应用的整个搭建和开发过程。下面我将来介绍若干个项目&#xff0c;带你来快速开发。…

ChatGPT OpenAI 完成Excel组合函数Vlookup+match多条件查找

ChatGPT OpenAI 现在已经助力职场办公。 我们现在有这样一个Excel需求: 根据姓名与科目查找对应的分数。可以使用Vlookup+match组合函数一起来实现 。 我们将公式复制到Excel中来进行验证。 ChatGPT生成的Excel函数公式可以直接进行使用。 更多实战内容。

找不到msvcp140_codevet_ids.dll,无法继续执行代码的解决方法分享

在使用 Photoshop&#xff08;简称 PS&#xff09;时&#xff0c;很多用户都遇到过找不到 msvcp140_codevet_ids.dll 的问题。这使得他们无法正常运行 PS&#xff0c;给工作和生活带来了诸多不便。本文将详细介绍 msvcp140_codevet_ids.dll 的相关知识&#xff0c;以及如何解决…

2023-09-13 LeetCode每日一题(检查骑士巡视方案)

2023-03-29每日一题 一、题目编号 2596. 检查骑士巡视方案二、题目链接 点击跳转到题目位置 三、题目描述 骑士在一张 n x n 的棋盘上巡视。在 有效 的巡视方案中&#xff0c;骑士会从棋盘的 左上角 出发&#xff0c;并且访问棋盘上的每个格子 恰好一次 。 给你一个 n x …

TypeScript类型系统层级

&#x1f3ac; 岸边的风&#xff1a;个人主页 &#x1f525; 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想&#xff0c;就是为了理想的生活 ! 目录 1. 顶层类型&#xff08;Top Type&#xff09; 1.1 any 类型 1.2 unknown 类型 2. 底层类型&#xff08;Bottom …

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析

linux设备树节点添加新的复位属性之后设备驱动加载异常问题分析 1 linux原始设备驱动信息1.1 设备树节点信息1.2 linux设备驱动1.3 makefile1.4 Kconfig1.5 对应的defconfig文件 2 修改之后的linux设备驱动2.1 修改之后的设备树节点信息2.2 原始test_fw.c出现的问题以及原因分析…

学习Bootstrap 5的第十四天

目录 Toast 如何创建 Toast 实例 打开 Toast 实例 滚动监听(Scrollspy) 如何创建滚动监听 实例 侧边栏导航(Offcanvas) 如何创建 Offcanvas 侧边栏 实例 侧边栏的方向 实例 设置背景及背景是否可滚动 实例 侧边栏案例 实例 Toast Toast 组件类似警告框&#…

抽奖界面及功能

1.代码 <template><view class"container"><view class"container_circle" v-for"(v,i) in circleList" :key"i":style"{top:v.topCirclerpx,left:v.leftCirclerpx,background-color:(i%2 0)?oneCircleColor:t…

大厂面试题:有了 G1 还需要其他垃圾回收器吗?

Java全能学习面试指南&#xff1a;https://javaxiaobear.cn 今天我们主要来看下这两个高频的面试考题&#xff1a; G1 的回收原理是什么&#xff1f;为什么 G1 比传统 GC 回收性能好&#xff1f; 为什么 G1 如此完美仍然会有 ZGC&#xff1f; 我们在上一篇中&#xff0c;简要…

Flask+pyecharts结合,html统计图呈现在前端页面

是我,是你 在网上看到这样一段话: “很多时候,你必须接受这世界上突如其来的失去。洒了的牛奶,遗失的钱包,走散的爱人,断掉的友情。当你做什么都于事无补的时候,唯一能做的,就是让自己努力好过一点。” <

iptables 目标地址转换

目录 一、实验准备 二、配置web服务器 三、配置web防火墙网卡 四、配置客户机网卡 五、测试 1、开启防火墙功能&#xff0c;设置源地址转换&#xff0c;通过改变我客户机的地址身份为web服务器同网段来实现访问 2、通过改变目标地址&#xff08;客户机&#xff09;的地址…

无法加载文件xxx,此系统上禁止运行脚本

在 VsCode 跑一个前端项目的时候出现如下错误&#xff1a;此系统上禁止运行脚本 解决&#xff1a;在终端执行指令设置 脚本执行策略 为 RemoteSigned 以管理员身份运行vs code&#xff1b;查看当前执行策略&#xff1a;get-ExecutionPolicy&#xff0c;如显示 Restricted 则表…

element UI table横向树结合checkbox进行多选,实现各个节点的[全选,半选,不选]状态附带模拟数据

element UI table横向树结合checkbox进行多选&#xff0c;实现各个节点的[全选&#xff0c;半选&#xff0c;不选]状态&#xff0c;包含模拟数据 思路&#xff1a; 步骤一、后端返回tree格式数据&#xff0c;先结合element-ui的table的数据格式要求&#xff0c;将tree转换成ta…

第30章_瑞萨MCU零基础入门系列教程之IRDA红外遥控实验

本教程基于韦东山百问网出的 DShanMCU-RA6M5开发板 进行编写&#xff0c;需要的同学可以在这里获取&#xff1a; https://item.taobao.com/item.htm?id728461040949 配套资料获取&#xff1a;https://renesas-docs.100ask.net 瑞萨MCU零基础入门系列教程汇总&#xff1a; ht…