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年年初到现在的一些经历和故事,我也很愿意我的故事分…

Android 样式小结

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

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

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…

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

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

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

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

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

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

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…

[今来] 神话故事:金马和碧鸡

文章目录 金马山和碧鸡山神话传说金马坊和碧鸡坊金马碧鸡 金马山和碧鸡山 昆明山明水秀&#xff0c;北枕蛇山&#xff0c;南临滇池&#xff0c;金马山和碧鸡山则东西夹峙&#xff0c;隔水相对&#xff0c;极尽湖光山色之美。金马山逶迤而玲珑&#xff0c;碧鸡山峭拔而陡峻&…

clickhouse数据库磁盘空间使用率过高问题排查

一、前言 clickhouse天天触发磁盘使用率过高告警&#xff0c;所以需要进行排查&#xff0c;故将排查记录一下。 二、排查过程 1、连接上进入clickhouse 2、执行语句查看各库表使用磁盘情况 SELECT database, table, formatReadableSize(sum(bytes_on_disk)) as disk_space F…

蓝桥杯物联网竞赛_STM32L071_8_ADC扩展模块

原理图&#xff1a; 扩展模块原理图&#xff1a; RP1和RP2分别对应着AIN1和AIN2&#xff0c;扭动它们&#xff0c;其对应滑动变阻器阻值也会变化 实验板接口原理图&#xff1a; 对应实验板接口PB1和PB0 即AN1对应PB1, AN2对应PB0 CubMx配置&#xff1a; ADC通道IN8和IN9才对…

uniApp项目的创建,运行到小程序

一、项目创建 1. 打开 HBuilder X 2. 右击侧边栏点击新建&#xff0c;选择项目 3. 填写项目名&#xff0c;点击创建即可 注&#xff1a;uniapp中如果使用生命周期钩子函数&#xff0c;建议使用哪种 ?(建议使用Vue的) 二、运行 1. 运行前先登录 2. 登录后点击 manifest.js…

基于lambda简化设计模式

前言 虽说使用设计模式可以让复杂的业务代码变得清晰且易于维护&#xff0c;但是某些情况下&#xff0c;开发可能会遇到我为了简单的业务逻辑去适配设计模式的情况&#xff0c;本文笔者就以四种常见的设计模式为例&#xff0c;演示如何基于lambda来简化设计模式的实现。 策略…