【C++】学习笔记——string_3

文章目录

  • 六、string类
    • 5. string类的操作
    • 6. string类的转换
    • 7. string类的模拟实现
  • 未完待续


搭配文档食用

六、string类

5. string类的操作

在这里插入图片描述
上面的函数中,有些是不常用的,咱们只挑几个重要的进行讲解。
c_str 就是将字符串转换成 C语言 字符串的格式。
get_allocator 就是申请内存池,目前用不上。
copy 就是拷贝,缺点是必须先创建好一个字符数组,字符数组还是形参,返回拷贝的个数,被下面的 substr 函数完虐。substr 函数返回一个 string 类型。
假设有个情景:需要我们找出文件名的后缀,该怎么办?

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

void test1()
{
	string s("file.cpp");
	// find函数返回第一个出现的下标
	size_t pos = s.find('.');
	// 在string类里,没找到都会以npos的形式返回。
	if (pos != string::npos)
	{
		string suffix = s.substr(pos);
		cout << suffix << endl;
	}
}

int main()
{
	test1();
	return 0;
}

在这里插入图片描述
find 函数
在这里插入图片描述
substr 函数
在这里插入图片描述
那么假设这个文件里 . 很多,我们要返回最后一个后缀,该怎么办?这个时候,就到了 rfind 大展身手的时候了,rfind 函数也是查找,不过是从后往前查找。

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

void test2()
{
	string s("file.cpp.rar.zip.tar");
	size_t pos = s.rfind('.');
	if (pos != string::npos)
	{
		string suffix = s.substr(pos);
		cout << suffix << endl;
	}
}

int main()
{
	test2();
	return 0;
}

在这里插入图片描述
再假设一个情景,有一个网址,将其 协议域名资源名 给分离开,怎么搞呢?

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

void test3()
{
	string url("https://cplusplus.com/reference/string/string/substr/");
	// 协议
	string protocol;
	// 域名
	string domain;
	// 资源名
	string uri;
	size_t i1 = url.find(":");
	if (i1 != string::npos)
	{
		protocol = url.substr(0, i1 - 0);
		cout << protocol << endl;
	}
	// 从域名开始找 '/'
	size_t i2 = url.find('/', i1 + 3);
	if (i2 != string::npos)
	{
		domain = url.substr(i1 + 3, i2 - i1 - 3);
		cout << domain << endl;
		// 剩下的都是资源名
		uri = url.substr(i2 + 1);
		cout << uri << endl;
	}
}

int main()
{
	test3();
	return 0;
}

在这里插入图片描述
compare 就是比较,不过 string 针对比较都做了重载,可用直接用 > ! = 等比较。

6. string类的转换

当我们涉及到其他类型转换成字符串类型时,有这样一个函数:
在这里插入图片描述

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

void test4()
{
	int a = 123456;
	string s = to_string(a);
	cout << s << endl;
}

int main()
{
	test4();
	return 0;
}

在这里插入图片描述
当然,有其他类型转换成字符串类型,就有字符串类型转换成其他类型。

在这里插入图片描述

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

void test5()
{
	string s1("13579");
	string s2("3.1415926");
	int i = stoi(s1);
	double d = stod(s2);
	cout << i << endl << d << endl;
}

int main()
{
	test5();
	return 0;
}

在这里插入图片描述

7. string类的模拟实现

接下来我们来具体实现一下 string 类。在实现 string 类的时候,我们需要将其封装一下,包含在自己的命名空间下。

// string.h 头文件下
#pragma once
#include<iostream>

// 我们自己实现的 string 类的专属命名空间
namespace my
{
	class string
	{
	public:
		//
	private:
		// 字符数组 存数据
		char* _str;
		// 无符号整形 存数据个数、字符串的长度
		size_t _size;
		// 存为该字符串已经分配的空间、容量
		size_t _capacity;
	};
}

接下来我们来实现构造函数,分为无参构造函数,和有参构造函数。

// my 命名空间下
class string
{
public:
	// 无参构造函数
	string()
		:_str(nullptr)  // 初始化列表
		,_size(0)
		,_capacity(0)
	{}
	// 有参构造函数
	string(const char* str)
		:_size(strlen(str))
	{
		_capacity = _size;
		_str = new char[_capacity + 1];
		strcpy(_str, str);
	}
private:
	char* _str;
	size_t _size;
	size_t _capacity;
};

构造函数不一定非要使用初始化列表,我们在有参构造函数里面若是使用初始化列表,由于三个对象都需要调用 strlen 函数,导致效率不高,所以可以初始化列表和赋值一起使用。


未完待续

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

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

相关文章

(附源码)超级简单的SSM图书交易系统,包含技术栈、架构图、设计图、教程

先看首页效果&#xff0c;包含买家、卖家、管理员三个端口。启动有问题可以联系我解决&#xff0c;微信&#xff1a;keepgoing4u 架构图&#xff1a; 用到软件 Jdk1.8 Mysql IntelliJ IDEA Maven 项目技术&#xff1a; Spring Boot SSM JSP mybatis Maven B/S模式 配置…

区块链技术:DAPP开发

随着科技的飞速发展&#xff0c;区块链技术逐渐渗透到各个领域&#xff0c;其中DAPP&#xff08;去中心化应用&#xff09;的发展尤为引人注目。作为一种新型的应用程序&#xff0c;DAPP正在重塑未来商业生态&#xff0c;其潜力无可估量。 一、DAPP的定义和特点 DAPP是指基于…

CSS高级选择器

一、属性选择器 以value开头的att属性的E元素&#xff1a;E[att^"value"]{ ;} a[href^http]{background-color"red";} css a[href^http]{background-color"red"; } html <!DOCTYPE html> <html lang"en"> <head&…

运营版游戏陪玩平台源码/tt语音聊天/声优服务/陪玩系统源码开黑/约玩源码

简述 一个人的游戏叫孤独&#xff0c;一群人的游戏才是乐趣&#xff0c;随着电竞产业在国内的快速发展&#xff0c;游戏陪练行业也迅速成长&#xff0c;现在很多游戏玩家为了追求更高质量的游戏体验感&#xff0c;往往会在玩游戏的过程中找陪练&#xff0c;通过陪玩系统进行预…

前端开发工程师——Vue

Vue学习笔记&#xff08;尚硅谷天禹老师&#xff09;_尚硅谷天禹老师vue2021讲课笔记下载-CSDN博客 模板语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" co…

Springboot+Vue+小程序+基于微信小程序电影票网购系统

Java电影票购买管理系统&#xff0c;Maven管理工具&#xff0c;MyBatis数据库操作&#xff0c;idea平台开发&#xff0c;后台的前端为Vue&#xff0c;前台客户端为小程序&#xff0c;功能丰富&#xff0c;还有电影周边购买功能&#xff0c;请在最下方二维码处联系我即可&#x…

如何判断第三方软件测试公司是否具有资质

在软件开发的过程中&#xff0c;软件测试是确保软件质量、稳定性和用户体验的关键环节。许多企业选择将软件测试工作交给专业的第三方软件测试公司来完成&#xff0c;以确保测试的准确性和公正性。但是&#xff0c;如何判断一个第三方软件测试公司是否具有资质呢&#xff1f;以…

【软件开发规范篇】JAVA后端开发编码格式规范

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

基于FPGA的数字信号处理(7)--如何确定Verilog表达式的位宽

一般规则 很多时候&#xff0c;Verilog中表达式的位宽都是被隐式确定的&#xff0c;即使你自己设计了位宽&#xff0c;它也是根据规则先确定位宽后&#xff0c;再扩展到你的设计位宽&#xff0c;这常常会导致结果产生意想不到的错误。比如&#xff1a; timescale 1ns/1ns mod…

GD32F470内存不能设置512KB

最近研究了下GD32F470芯片手册&#xff0c;发现标称的内存512KB&#xff0c; 其实是连TCMSRAM一起算的&#xff0c;即TCMSRAMSRAM0SRAM1SRAM2ADDSRAM 512KB, 其中SRAM0 - ADDSRAM 这段内存地址是连续的&#xff0c;从地址0x20000000开始。而TCMSRAM地址却是从0x10000000 - 0x1…

新建stm32工程模板步骤

1.先使用keil新建一个project的基本代码 2.stm32启动文件添加 将stm32的启动文件&#xff0c;在原工程当中新建一个Start文件夹把相关的启动文件放到文件夹当中 然后还需要找到下面三个文件 stm32f10x.h是stm32的外设寄存器的声明和定义&#xff0c;后面那两个文件用于配置系…

Unity 实现新手引导遮罩

Unity 复写OnPopulateMesh 实现新手引导遮罩、包含点击事件触发区域判断 https://download.csdn.net/download/shenliang34/89247117

git 第一次安装设置用户名密码

git config --global user.name ljq git config --global user.email 15137659164qq.com创建公钥命令 输入后一直回车 ssh-keygen -t rsa下面这样代表成功 这里是公钥的 信息输入gitee 中 输入下面命令看是否和本机绑定成功 ssh -T gitgitee.com如何是这样&#xff0c;恭喜…

【算法系列】哈希表

目录 哈希表总结 leetcode题目 一、两数之和 二、判定是否互为字符重排 三、存在重复元素 四、存在重复元素 II 五、字母异位词分组 六、在长度2N的数组中找出重复N次的元素 七、两个数组的交集 八、两个数组的交集 II 九、两句话中的不常见单词 哈希表总结 1.存储数…

HC-SR04超声波测距

什么是超声波 超声波是频率高于20000赫兹的声波。 超声波是一种特定频率范围内的声波&#xff0c;其特点在于频率高于人耳能够感知的上限&#xff0c;即超过20千赫兹&#xff08;Hz&#xff09;。这种高频率的声波具有一些独特的性质&#xff1a; 方向性好&#xff1a;超声波…

托普利兹矩阵(T矩阵)及其应用(Matlab demo测试)

托普利兹矩阵&#xff08;T矩阵&#xff09;及其应用&#xff08;Matlab demo测试&#xff09; 1. 概念2. Matlab简单测试2.1 生成测试2.2 基本性质及原理2.3 性质验证 3. 其他应用总结3.1 其他性质3.2 文献阅读看到的 参考资料 1. 概念 托普利兹矩阵&#xff0c;简称为T型矩阵…

可视化大屏在真实场景的效果,绝对震撼,不要再嘲笑其作用了

hello&#xff0c;我是大千UI工场&#xff0c;本地带来一批可视化大屏现场效果图&#xff0c;非常震撼&#xff0c;给大家带来身临其境的感受&#xff0c;欢迎关注点赞&#xff0c;有需求请私信。 有人可能会认为可视化大屏没有太多价值&#xff0c;可能是因为以下几个原因&am…

npm 安装 pnpm 时 报错 npm ERR! Unexpected token ‘.‘

问题 一个项目用的是 pnpm 安装的依赖&#xff0c;node 的版本是 16.16.0&#xff0c;nvm 的版本是 1.1.7&#xff0c;然后全局安装 pnpm 报错如下&#xff1a; 解决 我看网上的一些解决方案是说 nvm 版本过低导致&#xff0c;下面我们按照这个方向处理。 实首先下载 nvm-up…

Linux 文件管理命令Lawk wc comm join fmt

文章目录 2.Linux 文件管理命令2.44 awk&#xff1a;模式匹配语言1&#xff0e;变量2&#xff0e;运算符3&#xff0e;awk 的正则4&#xff0e;字符串函数5&#xff0e;数学函数案例练习 2.45 wc&#xff1a;输出文件中的行数、单词数、字节数案例练习2.46 comm&#xff1a;比较…

康姿百德学生床垫价格合理,为孩子提供健康睡眠环境

康姿百德集团公司学生床垫&#xff0c;关爱孩子的睡眠和健康 每个孩子都是家长新中的宝贝&#xff0c;在孩子健康成长的道路上&#xff0c;良好的睡眠起着至关重要的作用。而选择一款优质的床垫&#xff0c;不仅能帮助孩子更快进入梦乡&#xff0c;还能促进他们的健康发育。在…