【C++】STL之string类(2)

news2024/12/29 13:42:29

个人主页:平行线也会相交💪
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 平行线也会相交 原创
收录于专栏【C++之路】💌
本专栏旨在记录C++的学习路线,望对大家有所帮助🙇‍
希望我们一起努力、成长,共同进步。🍓在这里插入图片描述

目录

  • reserve
  • resize
  • insert
  • erase
    • string& erase (size_t pos = 0, size_t len = npos);
    • iterator erase (iterator p);
  • replace
    • string& replace(size_t pos, size_t len, const string& str);
  • c_str
  • find
  • find_first_of

reserve

在这里插入图片描述
在这里插入图片描述
reverse:在不改变字符串内容的前提下,预留一定的内存空间。
具体来说,当我们调用 reserve(n) 函数时,字符串对象会在内部分配至少能够容纳 n 个字符的内存空间,但是并不会对字符串长度进行改变。这就可以避免对字符串多次进行扩充操作,从而提高更改字符串长度的效率。

使用 reserve 函数并不会改变字符串对象的长度,如果需要更改字符串长度,可以使用 resize() 函数来完成,这个函数也可以指定字符串对象的长度,并自动调整内存大小。
举个例子,请看:

//这个地方不一定会开50的空间,也有可能比50还大一点,但是一定会开大于等于50的空间
int main()
{
	std::string str = "Hello, World!";

	std::cout << "Before reserve, capacity = " << str.capacity() << std::endl;

	str.reserve(50);

	std::cout << "After reserve, capacity = " << str.capacity() << std::endl;

	return 0;
}

在这里插入图片描述
那现在我们来试一试reverse的空间容量会不会缩回去呢?请看:
在这里插入图片描述
上面的实现是用vs来进行实现的,所以reverse空间并不会收缩,但是如果换Linux平台的话,可能就收缩了,所以reverse究竟收缩与否取决于平台,甚至是取决于不同平台下的不同版本。

resize

当我们调用 resize(n) 函数时,字符串对象会被调整为包含 n 个字符的大小。如果新的对象长度比原来对象长度要短,则被截断部分的字符会被删除。如果新的对象长度比原来对象长度要长,则被新增部分的字符将会填充为 ‘\0’ 字符。

resize() 可以接受两个参数,第一个参数表示新的字符串长度,第二个参数表示填充字符,如果忽略第二个参数,则默认填充字符为 ‘\0’。
还是来举个例子:
在这里插入图片描述
如果我们想填充为x的话,我们可以这样,请看:
在这里插入图片描述
当n比字符串数组小的时候,会对多余的数据进行删除,请看举例:
在这里插入图片描述
在这里插入图片描述
可以看到并不会缩容。

insert

在这里插入图片描述

还是来看举例:
在这里插入图片描述
如果要使用迭代器的话,请看:
在这里插入图片描述
但是如果我们不想要在第一个位置开始插入呢,我们想要在任意位置进行插入的话,我们可以使用指针的用法进行指针的加减,比如 str.insert(str.begin() + 5, 5, 'b');请看:
在这里插入图片描述
我们可以看到insert确实好用,可以在任意位置进行插入,但是这样效率会非常低,因为既然insert可以在任意位置插入元素的话就需要挪动数据,我们已经知道挪动数据的效率是非常低的,所以insert还是少用为好。

erase

在这里插入图片描述
在这里插入图片描述
earse:用于删除字符串中的一部分。

string& erase (size_t pos = 0, size_t len = npos);

先来看第一个函数原型(string& erase (size_t pos = 0, size_t len = npos);),其中,pos 表示要删除的起始位置(默认从 0 开始),len 表示要删除的字符数。如果不传入参数,则默认删除整个字符串。

该函数返回一个引用,指向被删除部分的 string 对象本身。请看:
在这里插入图片描述

在这里插入图片描述

iterator erase (iterator p);

iterator erase (iterator p);,用于从指定位置(迭代器p所指向的位置)删除一个元素,并返回指向被删除元素后面的元素的迭代器。
position表示指向容器中要删除的元素的迭代器。
在这里插入图片描述

replace

string& replace(size_t pos, size_t len, const string& str);

string& replace(size_t pos, size_t len, const string& str);:用来替换字符串中的字符或子字符串。
其中,pos表示要替换的子字符串在源字符串中的起始位置,len表示要替换的子字符串的长度,str表示要替换成的目标字符串。
请看举例:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

把所有空格替换为20%
在这里插入图片描述

c_str

c_str函数返回一个指向当前string对象所包含的字符串内容的C风格(即以’\0’结尾的字符数组)字符串的指针。

这个函数通常用于将string对象转换为C风格字符串,以便将其传递给一些C语言接口,因为这些接口可能无法处理C++的string对象。例如,在使用一些基于C的库的时候,我们可以使用c_str函数将string对象转换为字符数组来与这些库进行交互。

在这里插入图片描述
还是来举个例子来帮助大家来理解c_str,比如我们如何用C语言中的接口来打开这个文件呢:string filename = "test.cpp";,此时我们就需要一个C语言和C++中的一些衔接。
再比如,有一个string对象str,可以使用str.c_str()来返回一个指向C字符串的指针,请看:
在这里插入图片描述

find

在这里插入图片描述
在这里插入图片描述
我们先找到一个能够找到的例子,请看:
在这里插入图片描述

那如果我们找不到这里返回的应该是什么呢?
find函数返回一个size_t类型的位置信息,表示找到的子串的起始位置。如果没有找到指定子串,则返回一个特殊的常量std::string::npos,通常值为-1。

我们再来举个不能找到的例子,请看:
在这里插入图片描述
下面我们来做一个小题目:给定一个网址,将其中的协议 域名 资源名分别提取出来。请看:

int main()
{
	//https://legacy.cplusplus.com/reference/string/string/
	string ur1 = "https://legacy.cplusplus.com/reference/string/string/";
	//协议(protocol)  域名(domain)  资源名

	size_t pos1 = ur1.find("://");
	string protocol;
	cout << "pos1:" << pos1 << endl;
	if (pos1 != string::npos)
	{
		protocol = ur1.substr(0, pos1);
	}
	cout << "protocol:" << protocol << endl;//取协议

	size_t pos2 = ur1.find('/', pos1 + 3);
	string domain;
	string uri;
	if (pos1 != string::npos)
	{
		domain = ur1.substr(pos1 + 3, pos2 - (pos1 + 3));
		uri = ur1.substr(pos2 + 1);
	}
	cout << "domain:" << domain << endl;//取域名
	cout << "uri:" << uri << endl;//这里可以直接取资源名
	return 0;
}

在这里插入图片描述
在这里插入图片描述

find_first_of

find_first_of函数用于在字符串中查找第一个出现指定字符集合中任何一个字符的位置。
在这里插入图片描述

在这里插入图片描述

请看举例:

//find_first_of
//Maybe next year's situation will be very different from this year's.
int main()
{
	string str("Maybe next year's situation will be very different from this year's.");
	size_t found = str.find_first_of("aeiou");
	while (found != string::npos)
	{
		str[found] = '*';
		found = str.find_first_of("aeiou");
	}
	cout << str << endl;
	return 0;
}

在这里插入图片描述

好了,以上就是stl中string类的一些成员函数,就到这里吧。
再见啦,友友们!!!

在这里插入图片描述

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

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

相关文章

Vue中如何进行分布式任务调度与任务监控

Vue中如何进行分布式任务调度与任务监控 在复杂的系统中&#xff0c;如何有效地进行任务调度和监控是一个非常重要的问题。分布式系统中&#xff0c;任务调度和监控则更加复杂。Vue是一款流行的前端框架&#xff0c;本文将介绍如何在Vue中进行分布式任务调度和监控。 什么是分…

QML基础

从 Qt 4.7 开始&#xff0c;Qt 引入了一种声明式脚本语言&#xff0c;称为 QML&#xff08;Qt Meta Language 或者 Qt Modeling Language&#xff09;&#xff0c;作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库。 QML 是一种基于 JavaScript 的声明式语言。…

Qt下存储读写应用程序设置的三种方法

一、简介 List item 用户对应用程序经常有这样的要求&#xff1a;要求它能记住它的settings&#xff0c;比如窗口大小、位置和密码等等。有三种方法可以实现&#xff1a; 使用注册表&#xff1b;使用配置文件(.ini)&#xff1b;使用自定义文件(例如.txt)。 二、使用注册表 …

C盘空间不足清理方法 之 Google Chrome 浏览器用户数据迁移和Windows10 默认浏览器路径失效修复

原理分析 将原来C盘的目录拷贝到其他盘&#xff0c;然后用mklink建立一个联接&#xff0c;这里贴下ChatGPT对于三种链接的解释 # 在Windows 10中&#xff0c;mklink是一个命令行工具&#xff0c;用于创建符号链接&#xff08;symbolic link&#xff09;或者硬链接&#xff08…

chatgpt赋能python:Python异常过滤教程:如何正确处理和过滤Python中的异常

Python异常过滤教程&#xff1a;如何正确处理和过滤Python中的异常 介绍 Python是一种非常流行的编程语言&#xff0c;广泛应用于各种应用程序和领域中。在我们编写Python程序的过程中&#xff0c;通常要处理各种异常情况&#xff0c;比如用户输入错误&#xff0c;文件读取错…

CSS查缺补漏之《Web字体、2D/3D变换》

文章略长&#xff0c;慢慢享用&#xff5e; Web字体 css3新增了字体&#xff0c;使得用户不必局限在本计算机中安装的字体&#xff0c;可以使用多种字体&#xff1b; 需要在style中定义font-face规则&#xff1b; font-face { font-family: xxx名字; /* 必选项&#xff0c;自…

ROS2 入门应用 创建启动文件(Python)

ROS2 入门应用 创建启动文件&#xff08;Python&#xff09; 1. 创建功能包2. 添加依赖关系3. 添加启动文件4. 创建启动文件4.1. Python4.2. XML4.3. YAML 5. 编译和运行 1. 创建功能包 用Python、XML或YAML编写的启动文件可以启动和停止不同的节点&#xff0c;以及触发和处理…

设计模式(二十三):行为型之解释器模式

设计模式系列文章 设计模式(一)&#xff1a;创建型之单例模式 设计模式(二、三)&#xff1a;创建型之工厂方法和抽象工厂模式 设计模式(四)&#xff1a;创建型之原型模式 设计模式(五)&#xff1a;创建型之建造者模式 设计模式(六)&#xff1a;结构型之代理模式 设计模式…

chapter8:SpringBoot启动配置原理

尚硅谷SpringBoot顶尖教程 1. 启动流程简介 SpringBoot应用从主启动类启动后的运行流程主要包含下面几个要点&#xff1a; &#xff08;1&#xff09;准备环境 执行ApplicationContextInitializer#initialize()方法&#xff1b;监听器SpringApplicationRunListener回调cont…

ADC 读取电位器旋钮,用回差消除临界值档位跳动

就是比如&#xff0c;用电位器当旋钮做风扇调速&#xff0c;划分出10 个速度档位&#xff0c;对应10 个ADC 转换结果的阈值。如果直接比较阈值&#xff0c;当旋钮拧到临近阈值的地方时&#xff0c;ADC 结果的微小跳动会导致风扇档位在两个级别之间不停左右横跳&#xff0c;因此…

Linux MySQL 索引 事务 存储引擎 死锁

索引&#xff08;面试问得多&#xff09; 索引是一个排序的列表&#xff0c;包含索引字段的值和其相对应的行数据所在的物理地址 作用 加快表的查询速度&#xff0c;还可以对字段排序 如何实现的搜索加速&#xff1f; 没有索引的情况下&#xff0c;要查询某行数据&#xff0c;需…

代码审计——命令执行详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 命令注入是指因为系统使用了可以执行命令的危险函数&#xff0c;但是调用这些函数的参数可控&#xff0c;并没有做过滤或过滤不…

Flutter集成Umeng步骤及若干问题总结

由于Flutter项目中用到umeng统计及手机号一键登录功能&#xff0c;但实际集成使用中遇到各种坑&#xff0c;文档及demo却都没有提及&#xff0c;因此写下这篇文章&#xff0c;有遇到同样问题的同学可以参考下。 集成之前&#xff0c;最好先查看一下文档&#xff1a;https://de…

LangChain for LLM Application Development 基于LangChain开发大语言应用模型(上)

以下内容均整理来自deeplearning.ai的同名课程 Location 课程访问地址 DLAI - Learning Platform Beta (deeplearning.ai) 一、什么是LangChain 1、LangChain介绍 LangChain是一个框架&#xff0c;用于开发由大语言模型驱动的应用程序。开发者相信&#xff0c;最强大的、差异…

Ubuntu+Pycharm+QtDesigner,并配置Pyqt5

1. 安装PyQt5 pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pyqt5 2. 安装ubuntu环境下所需要的依赖包 sudo apt install pyqt5* 3. 安装QtDesigner sudo apt install qttools5-dev-tools 4. 设置Pycharm 步骤&#xff1a; File–>setting–>Tools–&…

ESP32设备驱动-VCNL4040趋近传感器

VCNL4040趋近传感器 文章目录 VCNL4040趋近传感器1、VNCL4040介绍2、硬件准备3、软件准备4、驱动实现1、VNCL4040介绍 VCNL4040 将趋近传感器 (PS)、环境光传感器 (ALS) 和高功率 IRED 集成到一个小型封装中。它通过CMOS工艺将光电二极管、放大器和模数转换电路集成到一个芯片…

Linux->线程库接口

目录 前言&#xff1a; 1 进程和线程 2 线程库接口 2.1 线程库基础理解 2.2 创建线程 2.2 线程资源回收 2.3 线程分离 前言&#xff1a; 本篇主要是对Linux原装线程库的函数接口进行学习&#xff0c;还有一部分的线程概念补充。 1 进程和线程 博主在上一篇文章当中有讲过…

中北大学 - 信息对抗大三下学习课程设计(爬取招标网站,进行招标分析,数据保存execl中)

文章目录 1. 题目描述2. 项目细节分析定时爬取任务思路避免多次爬取数据重复问题网站结构根据爬取信息确认招标地区 3. 项目代码4. 运行截图 1. 题目描述 中北大学信息安全技术爬虫课程设计 题目 5&#xff1a;招投标信息分析系统 &#xff08;20050441 2005031113&#xff09…

Floyd算法图解,C++实现Floyd算法

Floyd算法简介 Floyd算法是一种多源最短路径算法&#xff0c;是利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法&#xff0c;与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授罗伯特弗洛伊德命名。 时间复杂度&am…

Python模块multiprocessing 实现多进程并发

简介 multiprocessing模块是Python标准库中提供的一个用于实现多进程编程的模块。它基于进程而不是线程&#xff0c;可以利用多核CPU的优势&#xff0c;提高程序的执行效率&#xff0c;同时也可以实现进程间通信和数据共享。 目录 1. 参数说明 1.1. Process&#xff08;控制进…