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

news2024/10/5 22:07:47

文章目录

  • 六、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 函数,导致效率不高,所以可以初始化列表和赋值一起使用。


未完待续

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

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

相关文章

[Java EE] 多线程(六):线程池与定时器

1. 线程池 1.1 什么是线程池 我们前面提到,线程的创建要比进程开销小,但是如果线程的创建/销毁比较频繁,开销也会比较大.所以我们便引入了线程池,线程池的作用就是提前把线程都创建好,放到用户态代码中写的数据结构中,后面就可以随用随取. 线程池最大的好处就是减少每次启动,…

Python中动画显示与gif生成

1. 动画生成 主要使用的是 matplotlib.animation &#xff0c;具体示例如下&#xff1a; import matplotlib.pyplot as plt import matplotlib.animation as animation import numpy as np fig, ax plt.subplots() t np.linspace(0, 3, 40) g -9.81 v0 12 z g * t**2 / …

【Python函数和类6/6】类与对象

目录 目标 类与对象 类的定义 栗子 实例化对象 属性和方法的调用 特殊的self参数 类方法的其它参数 函数与方法的区别 总结 目标 在前面的博客当中&#xff0c;我们已经接触了一部分封装。比如&#xff1a;将数据扔进列表中&#xff0c;这就是一个简单…

短视频素材去哪里搬运?短视频素材有哪些类型?

在这个数字化和视觉传达至关重要的时代&#xff0c;选择合适的视频素材对于提升视频内容的吸引力和观众参与度至关重要。无论您是一名广告制片人、社交媒体经理还是独立视频制作者&#xff0c;以下这些精选的视频素材网站将为您提供从高清视频到特效资源的全面支持&#xff0c;…

工厂模式和策略模式区别

工厂模式和策略模式都是面向对象设计模式&#xff0c;但它们的目的和应用场景有所不同。 工厂模式是一种创建型设计模式&#xff0c;旨在通过使用一个工厂类来创建对象&#xff0c;而不是直接使用new关键字来创建对象。这样做可以使系统更容易扩展和维护&#xff0c;因为新的对…

reactjs后台管理系统搭建

1 通过yarn 模板创建reactjs项目 yarn create vite reactjs-antdesign-admin --template react-ts 2 基础路由测试 定义一个router/index.tsx&#xff0c;里面定义路由组件 const Router: React.FC () > {return (<HashRouter><Switch><Route path"…

Edge浏览器使用心得与深度探索

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

信息时代的智慧导航:高效搜索、信息筛选与信任构建的全面指南!

文章目录 一、高效搜索&#xff1a;快速定位目标信息的秘诀二、信息筛选&#xff1a;去伪存真&#xff0c;找到有价值的信息三、信任构建&#xff1a;深入了解与直接沟通《搜索之道&#xff1a;信息素养与终身学习的新引擎》亮点内容简介目录获取方式 随着科技的飞速发展&#…

前端基础学习html(2)

目录 表格标签&#xff1a; 列表标签&#xff1a; 表格标签&#xff1a; <!-- 表格基本架构 --><!-- tr表示一行&#xff0c;td表示一行内单元格 --><!--th为第一行表头加粗居中显示 --><table border"1"><thead><tr><th&g…

用Stream流方式合并两个list集合(部分对象属性重合)

一、合并出共有部分 package com.xu.demo.test;import java.util.Arrays; import java.util.List; import java.util.stream.Collectors;public class ListMergeTest1 {public static void main(String[] args) {List<User> list1 Arrays.asList(new User(1, "Alic…

【linux学习指南】linux指令与实践文件编写

文章目录 &#x1f4dd;前言&#x1f320; linux目录结构&#x1f309;linux命令介绍 &#x1f320;pwd命令&#x1f309;mkdir指令&#xff08;重要&#xff09; &#x1f320;cd 指令&#x1f309;touch指令 &#x1f320;rmdir指令 && rm 指令&#xff08;重要&…

nginx--配置文件

组成 主配置文件&#xff1a;nginx.conf 子配置文件&#xff1a;include conf.d/*.conf 协议相关的配置文件&#xff1a;fastcgi uwsgi scgi等 mime.types&#xff1a;⽀持的mime类型&#xff0c;MIME(Multipurpose Internet Mail Extensions)多用途互联⽹网邮件扩展类型&…

KUKA机器人KR3 R540维护保养——涂润滑脂

KUKA机器人在保养时少不了润滑脂&#xff0c;不同型号的机器人需要的润滑脂类型也不一样&#xff0c;保养时注意选用合适的润滑脂。本篇文章以KUKA机器人KR3 R540为例&#xff0c;在轴盖板 A2、A3、A5 的内侧涂上润滑脂。 一、涂润滑脂的作用 拆开机器人一个轴的盖板&am…

链表面试题2

1&#xff0c;合并两个有序链表 我们先定义一个虚拟节点newH&#xff0c; 然后按照上图所走&#xff0c;但是当其中一个链表走空时&#xff0c;我们只需返回另一个链表即可 class Solution {public ListNode mergeTwoLists(ListNode headA, ListNode headB) {ListNode newhead…

python基础语法--函数

一、函数概述 函数就是执行特定任务完成特定功能的一段代码。可以在程序中将某一段代码定义成函数&#xff0c;并指定一个函数名和接收的输入&#xff08;参数&#xff09;&#xff0c;这样就可以在程序的其他地方通过函数名多次调用并执行该段代码了。 每次调用执行后&#…

Mybatis-Plus学习:快速入门、核心功能、扩展功能、插件功能

文章目录 MybatisPlus快速入门快速开始常见注解常见配置 核心功能条件构造器&#xff08;Wrapper&#xff09;自定义SQLService接口基本用法基础业务接口复杂业务接口Lamda查询Lamda更新批量新增 扩展功能代码生成代码生成器快速开发插件 静态工具逻辑删除枚举处理器JSON处理器…

机器人系统ros2-开发实践04-ROS 2 启动文件管理大型项目的最佳实践

机器人上的大型应用通常涉及多个互连的节点&#xff0c;每个节点可以有许多参数。海龟模拟器中模拟多只海龟就是一个很好的例子。海龟模拟由多个海龟节点、世界配置以及 TF 广播器和监听器节点组成。在所有节点之间&#xff0c;存在大量影响这些节点的行为和外观的 ROS 参数。 …

【C++】哈希的应用---位图

目录 1、引入 2、位图的概念 3、位图的实现 ①框架的搭建 ②设置存在 ③设置不存在 ④检查存在 ​4、位图计算出现的次数 5、完整代码 1、引入 我们可以看一道面试题 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数…

罗宾斯《管理学》第15版笔记/课后习题/考研真题答案

第Ⅰ篇 管理导论 第1章 工作场所中的管理者和你 1.1 知识结构导图 1.2 考点难点归纳 1.3 课后习题详解 1.4 考研真题详解 附加模块一 管理史 知识结构导图 考点难点归纳 课后习题详解 考研真题详解 第2章 决 策 2.1 知识结构导图 2.2 考点难点归纳 2.3 课后习题详解…

C++string类使用大全

目录 温馨提示&#xff1a;这篇文章有约两万字 什么是string类&#xff1f; 一. 定义和初始化string对象 1.string的构造函数的形式&#xff1a; 2.拷贝赋值运算符 3.assign函数 二.string对象上的操作 1.读写string对象 2.读取未知数量的string对象 3.使用getline …