MyString:string类的模拟实现 1

MyString:string类的模拟实现

前言:

为了区分标准库中的string,避免编译冲突,使用命名空间 MyString。

namespace MyString
{class string{private:char* _str;size_t _size;size_t _capacity;const static size_t npos = -1;// C++标准库支持的特殊用法};

在这里插入图片描述

以下都在 MyString 内实现!

一、构造函数,析构函数,拷贝构造

1.1 构造函数

标准库中,构造string类的常见写法:

string s1; // 1
string s2("hello world"); // 2
public:string():_str(new char[1])// 给一个字节的空间作为标识,_size(0),_capacity(0){_str[_size] = '\0';}string(const char* str){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];// 多给一个空间,存'\0'strcpy(_str, str);}

实际上,对第二个构造函数的参数进行缺省,可以实现两种写法的完美统一。

    string(const char* str = "") // 字符串末尾有隐藏的'\0',不需要我们在缺省值加上'\0'{_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}
1.2 析构函数
public:~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}
1.3 拷贝构造(重点)

string类的拷贝构造需要实现深拷贝否则会造成资源的二次释放

public:string(const string& s){_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}

二、迭代器

public:typedef char* iterator;typedf const char* const_iterator;iterator begin(){return _str;}iterator end(){return _str + _size;}const_iterator begin() const{return _str;}const_iterator end() const{return _str + _size;}

范围for 本质是对迭代器的“傻瓜式”替换,一旦对 begin() end() 的函数名做修改,则无法调用,如:begin() ——> Begin() 。

三、reserve() 与 尾插(重点)

3.1 reserve()

【1】 reserve() 是对 _capacity 进行操作 (不对 _str 操作),而 _capacity 只计算有效字符个数不包括字符串末尾的 ‘\0’

【2】 在设计 reserve() 时,要考虑多开一个空间,用于存 ‘\0’ ;要对 _capacity 校正

【3】 在使用 reserve() 进行扩容时,只需要考虑 有效字符个数 即可。

public:void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];// strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}
  • n > _capacity 时,才需要调整
  • char* tmp = new char[n + 1] 多开一个空间,用于存 ‘\0’ 。
3.2 尾插一个字符:push_back()
public:void push_back(const char ch){if (_size == _capacity){size_t newCapacity = _capacity == 0 ? 4 : 2 * _capacity;reserve(newCapacity);// _capacity = newCapacity;// reserve中 已经对 _capacity 做过调整了}_str[_size] = ch;++_size;_str[_size] = '\0';}
  • 插入字符后,应在字符串末尾加上 ‘\0’否则通过 _str 访问字符串元素时会出现异常
3.3 尾插字符串:append()
public:void append(const char* str){int len = strlen(str);if (_size + len > _capacity){reserve(_size + len);// reserve(_size + len + 1); // reserve中 已考虑在字符串末尾加上'\0'}strcpy(_str + _size, str);// str 末尾有隐藏的 '\0'_size += len;}
  • str 末尾有隐藏的 ‘\0’
3.4 += 重载
  • s1 += “x”;
public:string& operator+=(const char ch){push_back(ch);return *this;}
  • s1 += “xxxx”;
public:string& operator+=(const char* str){append(str);return *this;}

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

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

相关文章

2023年 - 我的程序员之旅和成长故事

2023年 - 我的程序员之旅和成长故事 🔥 1.前言 大家好,我是Leo哥🫣🫣🫣,今天咱们不聊技术,聊聊我自己,聊聊我从2023年年初到现在的一些经历和故事,我也很愿意我的故事分…

TS学习——快速入门

TypeScript简介 TypeScript是JavaScript的超集。它对JS进行了扩展,向JS中引入了类型的概念,并添加了许多新的特性。TS代码需要通过编译器编译为JS,然后再交由JS解析器执行。TS完全兼容JS,换言之,任何的JS代码都可以直…

Android 样式小结

关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、使用3.1 创建并应用样式3.2 创建并…

DJI ONBOARD SDK—— 基础控制功能 Joystick的讲解,使用和扩展

DJI ONBOARD SDK/DJI OSDK ROS—— 基础控制功能 Joystick的使用 概述 使用OSDK/OSDK_ROS 的无人机飞行控制功能,能够设置并获取无人机各项基础参数,控制无人机执行基础飞行动作,通过Joystick 功能控制无人机执行复杂的飞行动作。 Joystic…

【精彩回顾】恒拓高科亮相第十一届深圳军博会

2023年12月6日-8日,由中国和平利用军工技术协会、全国工商联科技装备业商会、深圳市国防科技工业协会等单位主办以及政府相关部门支持,深圳企发展览有限公司承的“2023第11届中国(深圳)军民两用科技装备博览会(深圳军博…

02 CSS基础入门

文章目录 一、CSS介绍1. 简介2. 相关网站3. HTML引入方式 二、选择器1. 标签选择器2. 类选择器3. ID选择器4. 群组选择器 四、样式1. 字体样式2. 文本样式3. 边框样式4. 表格样式 五、模型和布局1. 盒子模型2. 网页布局 一、CSS介绍 1. 简介 CSS主要用于控制网页的外观&#…

C#如何使用SqlSugar操作MySQL/SQL Server数据库

一. SqlSugar 连接MySQL数据库 public class MySqlCNHelper : Singleton<MySqlCNHelper>{public static SqlSugarClient CnDB;public void InitDB() {//--------------------MySQL--------------------CnDB new SqlSugarClient(new ConnectionConfig(){ConnectionString…

穷举问题-搬砖(for循环)

某工地需要搬运砖块&#xff0c;已知男人一人搬3块&#xff0c;女人一人搬2块&#xff0c;小孩两人搬1块。如果想用n人正好搬n块砖&#xff0c;问有多少种搬法&#xff1f; 输入格式: 输入在一行中给出一个正整数n。 输出格式: 输出在每一行显示一种方案&#xff0c;按照&q…

玩转大数据12:大数据安全与隐私保护策略

1. 引言 大数据的快速发展&#xff0c;为各行各业带来了巨大的变革&#xff0c;也带来了新的安全和隐私挑战。大数据系统通常处理大量敏感数据&#xff0c;包括个人身份信息、财务信息、健康信息等。如果这些数据被泄露或滥用&#xff0c;可能会对个人、企业和社会造成严重的损…

Unity 资源管理之Resources

Resources是一个特殊的文件夹&#xff0c;用于存放运行时加载的资源。 Resources文件夹中可以放置各种类型的资源文件&#xff0c;如纹理、模型、音频、预制体等&#xff0c;一般用来存储预制体和纹理信息。 通过API可以加载和访问该文件夹及其子文件夹中的资源。 当我们打包…

大数据Doris(三十五):Unique模型(唯一主键)介绍

文章目录 Unique模型(唯一主键)介绍 一、创建doris表 二、插入数据

【华为OD题库-076】执行时长/GPU算力-Java

题目 为了充分发挥GPU算力&#xff0c;需要尽可能多的将任务交给GPU执行&#xff0c;现在有一个任务数组&#xff0c;数组元素表示在这1秒内新增的任务个数且每秒都有新增任务。 假设GPU最多一次执行n个任务&#xff0c;一次执行耗时1秒&#xff0c;在保证GPU不空闲情况下&…

海外独立站站长常用的ChatGPT通用提示词模板

目标市场&#xff1a;如何确定目标市场&#xff1f; 用户需求&#xff1a;如何了解用户需求&#xff1f; 网站设计&#xff1a;如何设计一个优秀的网站&#xff1f; 用户体验&#xff1a;如何提升用户体验&#xff1f; 功能规划&#xff1a;请帮助我规划网站的功能。 内容…

linux 应用开发笔记---【标准I/O库/文件属性及目录】

一&#xff0c;什么是标准I/O库 标准c库当中用于文件I/O操作相关的一套库函数&#xff0c;实用标准I/O需要包含头文件 二&#xff0c;文件I/O和标准I/O之间的区别 1.标准I/O是库函数&#xff0c;而文件I/O是系统调用 2.标准I/O是对文件I/O的封装 3.标准I/O相对于文件I/O具有更…

SpringBoot 项目 Jar 包加密,防止反编译

1场景 最近项目要求部署到其他公司的服务器上&#xff0c;但是又不想将源码泄露出去。要求对正式环境的启动包进行安全性处理&#xff0c;防止客户直接通过反编译工具将代码反编译出来。 2方案 第一种方案使用代码混淆 采用proguard-maven-plugin插件 在单模块中此方案还算简…

调用别人提供的接口无法通过try catch捕获异常(C#),见鬼了

前几天做CA签名这个需求时发现一个很诡异的事情&#xff0c;CA签名调用的接口是由另外一个开发部门的同事(比较难沟通的那种人)封装并提供到我们这边的。我们这边只需要把数据准备好&#xff0c;然后调他封装的接口即可完成签名操作。但在测试过程中&#xff0c;发现他提供的接…

[后端卷前端2]

绑定class 为什么需要样式绑定呢? 因为有些样式我们希望能够动态展示 看下面的例子: <template><div><p :class"{active:modifyFlag}">class样式绑定</p></div> </template><script>export default {name: "goo…

人力资源服务展示网站作用有哪些

就业劳务问题往往是不少人群关注的问题&#xff0c;每个城市都聚集着大量求业者&#xff0c;而人力资源管理公司每年也会新增不少&#xff0c;对求业者来说&#xff0c;通过人力资源公司可以快速便捷的找到所需工作&#xff0c;而对公司来说&#xff0c;市场大量用户可以带来收…

C语言第十八集(动态内存管理)

1.malloc函数可以开辟一块空间,具体搜: 2.malloc函数申请的空间在内存的堆区 而且它只负责帮你申请空间,不负责帮你清理空间 3.free函数可以释放内存 4.free函数释放的是内存中的堆区,具体搜: 5.在free函数调用完后记得把对应的指针设为空指针 6.calloc函数跟malloc函数差…

揭秘字符串的奥秘:探索String类的深层含义与源码解读

文章目录 一、导论1.1 引言&#xff1a;字符串在编程中的重要性1.2 目的&#xff1a;深入了解String类的内部机制 二、String类的设计哲学2.1 设计原则&#xff1a;为什么String类如此重要&#xff1f;2.2 字符串池的概念与作用 三、String类源码解析3.1 成员变量3.2 构造函数3…