【C++庖丁解牛】实现string容器的增删查改 | string容器的基本接口使用


🍁你好,我是 RO-BERRY
📗 致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
🎄感谢你的陪伴与支持 ,故事既有了开头,就要画上一个完美的句号,让我们一起加油

请添加图片描述


目录

  • 前言
  • 📖push_back接口
  • 📖append接口
  • 📖operator+= (重点)
  • 📖replace接口
  • 📖find接口
  • 📖npos
  • 📖find + npos(重点)
  • 📖substr
  • 📖insert接口
  • 📖erase接口
  • 📖refind接口
  • 📖c_str接口
  • 📖find_first_of接口
  • 📖compare接口
  • 总结


前言

函数名称功能说明
push_back在字符串后尾插字符c
append在字符串后追加一个字符串
operator+= (重点)在字符串后追加字符串str
c_str(重点)返回C格式字符串
find + npos(重点)从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
rfind从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
substr在str中从pos位置开始,截取n个字符,然后将其返回

📖push_back接口

int main()
{
	string str;
	str.push_back(' ');   // 在str后插入空格
	str.append("hello");  // 在str后追加一个字符"hello"
	str += 'w';           // 在str后追加一个字符'w'   
	str += "xxx";          // 在str后追加一个字符串"xxx"
	cout << str << endl;
	cout << str.c_str() << endl;   // 以C语言的方式打印字符串
	return 0;
}

在这里插入图片描述


📖append接口

append()是一个成员函数,用于将字符串或字符序列添加到当前字符串的末尾。它有多种重载形式,可以接受不同类型的参数。

在这里插入图片描述
这里其实用第一个就已经足够了,其他的显的有些多余

  1. 传入一个字符串作为参数,它会将该字符串的内容添加到当前字符串的末尾。
int main()
{
	string s1("hello");
	s1.append("abcd");
	cout << s1 << endl;
	return 0;
}

在这里插入图片描述

  1. 如果传入一个字符数组作为参数,它会将该字符数组的内容添加到当前字符串的末尾。
string str = "Hello";
char arr[] = " World";
str.append(arr);
// 现在str的值为"Hello World"
  1. 如果传入一个字符和重复次数作为参数,它会将该字符重复指定次数后添加到当前字符串的末尾
string str = "Hello";
char ch = '!';
int repeatCount = 3;
str.append(repeatCount, ch);
// 现在str的值为"Hello!!!"

4.如果传入字符串的头和尾作为参数,它会将该字符添加到当前字符串的末尾

int main()
{
	string s1("hello");
	s1.append("abcd");
	cout << s1 << endl;

	//在s2后面加入s1
	string s2 = "xxxx";
	s2.append(s1.begin(), s1.end());
	cout << s2 << endl;
	return 0;
}

📖operator+= (重点)

int main()
{
	//最简便的方式
	string s1("hello");
	string s2 = "xxxx";
	s1 += '!';
	cout << s1 << endl;
	s1 += "world";
	cout << s1 << endl;
	s1 += s2;
	cout << s1 << endl;
	return 0;
}

在这里插入图片描述


📖replace接口

string容器的replace接口用于替换字符串中的一部分内容。它有多个重载形式,可以根据需要进行不同的替换操作。

  1. replace(pos, count, str):将从位置pos开始的count个字符替换为字符串str。
    示例:string str = “Hello, world!”;
    str.replace(7, 5, “CSDN”);
    替换后的字符串为:“Hello, CSDN!”
  1. replace(pos, count, str, pos2, count2):将从位置pos开始的count个字符替换为字符串str中从位置pos2开始的count2个字符。
    示例:string str = “Hello, world!”;
    string str2 = “CSDN”;
    str.replace(7, 5, str2, 0, 4);
    替换后的字符串为:“Hello, CSDN!”
  1. replace(iterator1, iterator2, str):将迭代器iterator1和iterator2之间的字符替换为字符串str。
    示例:string str = “Hello, world!”;
    string str2 = “CSDN”;
    str.replace(str.begin() + 7, str.begin() + 12, str2);
    替换后的字符串为:“Hello, CSDN!”
  1. replace(iterator1, iterator2, iterator3, iterator4):将迭代器iterator1和iterator2之间的字符替换为迭代器iterator3和iterator4之间的字符。
    示例:string str = “Hello, world!”;
    string str2 = “CSDN”;
    str.replace(str.begin() + 7, str.begin() + 12, str2.begin(), str2.end());
    替换后的字符串为:“Hello, CSDN!”

📖find接口

string容器的find接口用于在字符串中查找指定的子串,并返回其第一次出现的位置。该接口有多个重载形式,可以根据需要选择使用。

  1. find(const string& str, size_t pos = 0) const:
    在字符串中从指定位置pos开始查找子串str,并返回其第一次出现的位置。如果找不到,则返回string::npos。
  1. find(const char* s, size_t pos = 0) const:
    在字符串中从指定位置pos开始查找C风格字符串s,并返回其第一次出现的位置。如果找不到,则返回string::npos。
  1. find(char c, size_t pos = 0) const:
    在字符串中从指定位置pos开始查找字符c,并返回其第一次出现的位置。如果找不到,则返回string::npos。

其中,pos参数表示查找的起始位置,默认为0,即从字符串的开头开始查找。


📖npos

string::npos是C++中string类的一个静态成员变量,它表示一个无效的或者不存在的位置。在string类中,npos的值是一个特殊的常量,通常被用来表示字符串中某个字符或子串不存在的情况。

当我们在使用string类的成员函数进行查找操作时,如果没有找到指定的字符或子串,那么返回值就会是npos。这个值在不同的编译器中可能会有所不同,但通常它的值是-1或者一个非法的索引值。
使用npos可以方便地判断字符串中是否包含某个字符或子串。


📖find + npos(重点)

int main()
{
	string s1("hello world hello world");
	cout << s1 << endl;

	//将所有的空格替换成20%
	size_t pos = s1.find(' ');
	while (pos != string::npos)
	{
		s1.replace(pos, 1, "%20"); //replace效率是特别低的最好不要用
		pos = s1.find(' ');
	}
	cout << s1 << endl;
	return 0;
}

在这里插入图片描述


📖substr

substr是一种字符串操作函数,用于从一个字符串中提取子字符串。它的语法如下:
string substr (size_t pos, size_t len) const;
其中,pos表示要提取的子字符串的起始位置,len表示要提取的子字符串的长度。返回值是一个新的字符串,包含了从原始字符串中提取的子字符串。

获取file的后缀

int main() 
{
	string file("string.cpp");
	size_t pos = file.rfind('.');
	string suffix(file.substr(pos, file.size() - pos)); //取后缀并拷贝构造suffix
	cout << suffix << endl;
	return 0;
}

在这里插入图片描述
取出url中的域名

int main() 
{
	string url("http://www.cplusplus.com/reference/string/string/find/");
	cout << url << endl;
	size_t start = url.find("://");
	if (start == string::npos)
	{
		cout << "invalid url" << endl;
		return 1;
	}
	start += 3;
	size_t finish = url.find('/', start);
	string address = url.substr(start, finish - start);
	cout << address << endl;
	return 0;
}

在这里插入图片描述


📖insert接口

string容器的insert接口用于在指定位置插入字符或字符串。它有多个重载形式,具体取决于插入的内容和位置。

  1. insert(pos, str):在指定位置pos前插入字符串str。
    示例:str.insert(3, "hello") 将在索引为3的位置前插入字符串"hello"。

2. insert(pos, str, subpos, sublen):在指定位置pos前插入字符串str的子串,子串的起始位置为subpos,长度为sublen
示例:str.insert(5, "world", 2, 3) 将在索引为5的位置前插入字符串"wor"。

  1. insert(pos, n, ch):在指定位置pos前插入字符ch的副本,重复插入n次。
    示例:str.insert(2, 3, 'a') 将在索引为2的位置前插入3个字符’a’。

📖erase接口

string容器的erase接口用于删除指定位置的字符或者一段字符。它有两种重载形式:

erase(pos, count):删除从位置pos开始的count个字符。其中,pos是一个索引值,表示要删除的起始位置;count是要删除的字符数量。

erase(iterator first, iterator last):删除从迭代器first指向的字符开始,到迭代器last指向的字符之前的所有字符。其中,first和last是迭代器,表示要删除的字符范围。

需要注意的是,erase操作会改变原始字符串,删除指定位置的字符后,后面的字符会自动向前移动。


📖refind接口

与find()函数类似,但是从字符串的末尾开始查找子串

size_t refind(const string& str, size_t pos = 0) const;
其中,str是要查找的子串,pos是查找的起始位置,默认为0。该函数返回子串第一次出现的位置,如果找不到则返回string::npos。

使用示例:

#include <iostream>
#include <string>
using namespace std;


int main() {
	string str = "Hello, world!";
	string subStr = "world";

	size_t pos = str.find(subStr);
	if (pos != string::npos) 
	{
		cout << "子串 \"" << subStr << "\" 在字符串 \"" << str << "\" 中的位置是:" << pos << endl;
	}
	else 
	{
		cout << "未找到子串 \"" << subStr << "\" 在字符串 \"" << str << "\" 中" << endl;
	}
	return 0;
}

在这里插入图片描述


📖c_str接口

c_str()是C++中的一个字符串成员函数,用于返回一个指向以null结尾的字符数组(C风格字符串)的指针。它通常用于将C++的std::string对象转换为C风格字符串。
使用c_str()函数可以方便地将std::string对象传递给需要C风格字符串作为参数的函数或接口。

例如,如果你有一个std::string对象str,你可以通过调用str.c_str()来获取一个指向以null结尾的字符数组的指针。

需要注意的是:c_str()返回的指针指向的字符数组是只读的,不能修改其中的内容。如果需要修改字符串内容,应该使用其他方法。

📖find_first_of接口

string容器的find_first_of()函数是用于在字符串中查找第一个与指定字符序列中的任何字符匹配的字符的位置。它的语法如下:

size_t find_first_of(const string& str, size_t pos = 0) const noexcept;

其中,str是要查找的字符序列,pos是开始查找的位置,默认为0。
该函数返回一个size_t类型的值,表示找到的字符的位置。如果未找到匹配的字符,则返回string::npos。
该函数会从字符串的pos位置开始逐个字符地与str中的字符进行匹配,直到找到第一个匹配的字符或者到达字符串的末尾。

将语句中的“aeiou”全部替换成“ * ”

#include <iostream>       // std::cout
#include <string>         // std::string
#include <cstddef>        // std::size_t

int main()
{
	std::string str("Please, replace the vowels in this sentence by asterisks.");
	std::size_t found = str.find_first_of("aeiou");
	while (found != std::string::npos)
	{
		str[found] = '*';
		found = str.find_first_of("aeiou", found + 1);  
	}
	std::cout << str << '\n';

	return 0;
}

在这里插入图片描述

📖compare接口

string容器的compare()函数是用于比较两个字符串的。它返回一个整数值,表示两个字符串的大小关系。
compare()函数有以下几种用法:

1. compare(str):将当前字符串与参数str进行比较。返回值为0表示两个字符串相等,返回值大于0表示当前字符串大于参数str,返回值小于0表示当前字符串小于参数str。
2. compare(pos, len, str):从当前字符串的位置pos开始,比较长度为len的子串与参数str进行比较。返回值的含义与上述相同。
3. compare(pos, len, str, subpos, sublen):从当前字符串的位置pos开始,比较长度为len的子串与参数str的子串(从subpos开始,长度为sublen)进行比较。返回值的含义与上述相同。

注意,compare()函数是区分大小写的,即大写字母和小写字母被认为是不同的字符。

#include <iostream>
#include <string>

int main()
{
	std::string str1("green apple");
	std::string str2("red apple");

	if (str1.compare(str2) != 0)
		std::cout << str1 << " is not " << str2 << '\n';

	if (str1.compare(6, 5, "apple") == 0)
		std::cout << "still, " << str1 << " is an apple\n";

	if (str2.compare(str2.size() - 5, 5, "apple") == 0)
		std::cout << "and " << str2 << " is also an apple\n";

	if (str1.compare(6, 5, str2, 4, 5) == 0)
		std::cout << "therefore, both are apples\n";

	return 0;
}

在这里插入图片描述

总结

在这里只是着重进行了string容器的常用接口的介绍以及使用,更多的接口还需要去查阅,修行之路还很漫长,让我们共同努力

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

关于stm32(CubeMX+HAL库)的掉电检测以及flash读写

1.掉电检测 CubeMX配置 只需使能PVD中断即可 但是使能了PVD中断后还需要自行配置一些PWR寄存器中的参数&#xff0c;我也通过HAL库进行编写 void PVD_config(void) {//配置PWRPWR_PVDTypeDef sConfigPVD; sConfigPVD.PVDLevel PWR_PVDLEVEL_7; …

蓝桥杯2023年第十四届省赛真题-与或异或

一共10个电门&#xff0c;穷举310次 #include<stdio.h> #include<math.h> int main(){int a[5][5], max (int)pow(3, 10), t, op, count 0;a[0][0] a[0][2] a[0][4] 1;a[0][1] a[0][3] 0;for(int k 0; k < max; k){t k;for(int i 1; i < 5; i){fo…

vite ssr服务端渲染

阅读 Vue文档 这一章里有说过&#xff0c;vue是支持服务端渲染的。 通过createSSRApp创建vue组件实例&#xff0c;并使用renderToString将在服务器渲染好template并返回字符串结构&#xff0c;通过替换占位字符将渲染好的字符串输出到html上&#xff0c;这样的一个过程就实现了…

发送短信验证码

​​​​​​【短信验证码-快速报备签名】三网短信接口-短信-短信验证码-短信服务-三网短信接口-短信-三网短信【最新版】_商业智能_电商_金融-云市场-阿里云阿里云云市场提供 专注企业短信服务10年运营与技术积累&#xff0c;稳定、安全、快速。服务&#xff0c;建站服务&…

【word技巧】word文件如何设置打开密码?可以试试这两种方法!

Word文件想要设置密码打开文件&#xff0c;我们可以给文件设置一个打开密码&#xff0c;这样只有知道密码的人才能够打开查看文件&#xff0c;今天分享两个word文件设置打开密码的方法。 一、 打开word文档后&#xff0c;点击【文件】-【信息】-【保护文档】这里有很多选项&a…

excel统计分析——一元直线回归

参考资料&#xff1a;生物统计学 两个具有因果关系的协变量如果呈直线关系&#xff0c;可以用直线回归模型来分析两个变量的关系。直线回归&#xff08;linear regression&#xff09;是回归分析中最简单的类型&#xff0c;建立直线回归方程并经检验证明两个变量存在直线回归关…

Altium Designer怎么设置默认原理图纸张大小

Altium Designer怎么设置默认原理图纸张大小 绘制原理图时我们需要设置好原理图图纸大小&#xff0c;建议大家可以将默认原理图图纸设置为A3&#xff0c;A3图纸大小可以容纳下大部分原理图&#xff0c;这样就不用每次画原理图前去修改图纸大小&#xff0c;可以提高设计效率。 …

Redis底层数据结构之Hash

文章目录 1. Redis底层hash编码格式2. Redis 6源码分析3. Redis 7源码分析 1. Redis底层hash编码格式 在redis6中hash的编码格式分别是ziplist&#xff08;压缩列表&#xff09;和hashtable&#xff0c;但在redis7中hash的编码格式变为了listpack&#xff08;紧凑列表&#xf…

如何不依赖Unity直接解压unitypackage的内容

使用场景 我们都知道unity的资源导出是导出成.unitypackage文件,如果要里面的内容,得打开Unity,将unitypackage导入进去才能看到里面的内容。 但是很多时候我们下了几十个unitypackage资源包,又不清楚好不好用,而且导入之后编译特别慢,unity又不提供批量解压的功能,所…

好消息!电商平台订单API同步订单详情信息免申请审核调用指南!

淘宝开放平台订单类API 测试key获取 拼多多开放平台订单API列表 custom-自定义API操作 taobao.custom/pinduoduo.custom 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;secretString是调用密钥api_nameString是API接口名称&…

day08-Mybatis入门

MyBatis 是一款优秀的 持久层 框架&#xff0c;用于简化 JDBC 的开发。 官网&#xff1a;https://mybatis.org/mybatis-3/zh/index.html 一、快速入门 1.1 Mybatis 操作数据库的步骤 准备工作(创建 springboot 工程、数据库表 user、实体类 User)引入 Mybatis 的相关依赖&…

基于Qt 和python 的自动升级功能

需求&#xff1a; 公司内部的一个客户端工具&#xff0c;想加上一个自动升级功能。 服务端&#xff1a; 1&#xff0c;服务端使用python3.7 &#xff0c;搭配 fastapi 和uvicorn 写一个简单的服务&#xff0c;开出一个get接口&#xff0c;用于客户端读取安装包的版本&#…

北京市办理大兴道路运输许可证所需条件及注意事项

尊敬的客户&#xff1a; 感谢您选择北京经典世纪集团有限公司作为您的信任合作伙伴。我们从多个角度&#xff0c;为您详细解析办理大兴道路运输许可证所需的条件及注意事项&#xff0c;以便您轻松高效地完成相关手续。&#xff08;游览器搜经典世纪胡云帅&#xff09;。 我们…

Android7.1 ANR error 弹窗处理

Android7.1 ANR error 弹窗处理 问题描述解决方法 郑重声明:本人原创博文&#xff0c;都是实战&#xff0c;均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Rockchip OS:Android 7.1.2 Kernel: 3.10 问题描述 有时会用到第三方apk&#xff0c;内置到系统中&…

Linux从0到1——Linux环境基础开发工具的使用(上)

Linux从0到1——Linux环境基础开发工具的使用&#xff08;上&#xff09; 1. Linux软件包管理器yum1.1 yum介绍1.2 用yum来下载软件1.3 更新yum源 2. Linux编辑器&#xff1a;vi/vim2.1 vim的基本概念2.2 vim的基本操作2.3 vim正常模式命令集2.4 vim底行模式命令集2.5 视图模式…

【全志H616】-2 写一个自己的串口

【全志H616】-2 写一个自己的串口 1、基本命令 重启 sudo rebootLinux系统下一个文件夹的文件复制到另一个文件夹下 cp flags.c /home/user05/lab09/flags_revised.c //复制当前文件夹下的 flags.c 文件到 lab09 文件夹下flags_recised.c 文件cp oled_demo.c /home/orangep…

在图片上进行标记

文章目录 需求分析 需求 底图是一张图片&#xff0c;要在图上做标记&#xff0c;对标记的位置有交互行为鼠标滚顶页面&#xff0c;标记位置不发生变化页面发生缩放&#xff0c;标记位置不发生变化 分析 <template><divv-loading"loading"class"point-m…

什么是智慧公厕?对公共厕所智能实时监测管理控制,城市管理更高效智能

公共厕所一直以来都是城市管理的难题之一&#xff0c;但随着智慧科技的发展和应用&#xff0c;智慧公厕成为了解决这一问题的利器。智慧公厕是一种信息化的新型公共厕所&#xff0c;通过全面感知平台实时监测公共厕所的使用状态&#xff0c;并将数据转化为可视、可算、可管的数…

读取txt文件并统计每行最长的单词以及长度

读取txt文件并统计每行最长的单词以及长度 题目 在 D:\\documant.txt 文本中,文件中有若干行英文文本,每行英文文本中有若干个单词&#xff0c;每个单词不会跨行出现每行至多包含100个字符,要求编写一个程序,处理文件,分析各行中的单词,找到每行中的最长单词&#xff0c;分别…

互联网剧本杀小程序,如何创新发展提高收益

近年来&#xff0c;剧本杀深受年轻人的喜欢&#xff0c;一度成为了大众的社交方式&#xff0c;剧本杀为年轻人提供了一个全新的娱乐游戏和社交为一体的模式。 不过随着剧本杀市场入局的人越来越多&#xff0c;市场的发展也迎来了“拐点”&#xff0c;剧本杀逐渐趋向高质量发展…