C++类的模拟实现
📟作者主页:慢热的陕西人
🌴专栏链接:C++
📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言
本博客主要内容讲解了简单模拟实现string类
C++类的模拟实现
文章目录
- C++类的模拟实现
- @[toc]
- Ⅰ.默认成员函数部分
- Ⅱ. 常用成员函数的实现
- Ⅲ. 运算符以及输入输出流的重载
- Ⅳ. 迭代器实现
文章目录
- C++类的模拟实现
- @[toc]
- Ⅰ.默认成员函数部分
- Ⅱ. 常用成员函数的实现
- Ⅲ. 运算符以及输入输出流的重载
- Ⅳ. 迭代器实现
Ⅰ.默认成员函数部分
①构造函数
选择使用了带有缺省参数的构造函数写法:当没有传入字符串的时候,选择将string中的字符串初始化为空串。
初始化列表部分只对_size进行了初始化。
string(const char* str = "") :_size(strlen(str)) {_capacity = _size == 0 ? 3 : _size;_str = new char[_capacity + 1];//+1因为要多以\0strcpy(_str, str); }②拷贝构造函数
拷贝构造函数是相当重要的,因为默认生成的拷贝构造函数只能实现浅拷贝,所以我们要自己来实现。
因为string类中涉及到了指针指向空间的问题所以在拷贝的时候也是需要新new一个空间出来的,这样就不会造成一份空间被析构两次的情况了
string(const string& s) :_size(s._size) ,_capacity(s._capacity) {_str = new char[_capacity + 1];strcpy(_str, s._str); }③析构函数
析构函数用于释放和清理string类实例化产生的空间。
~string() {delete[] _str;_str = nullptr;_capacity = 0;_size = 0; }
Ⅱ. 常用成员函数的实现
c_str()
用于返回string的字符串内容的函数。
char* c_str() {return _str; }swap()
用于交换两个string类的函数
void swap(string& s) {std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity); }find()
①从
pos位置开始在字符串寻找和ch相同的字符,并返回它第一次出现的位置② 从
pos位置开始在字符串寻找和str相同的字符串,并返回它第一次出现的位置size_t find(char ch, size_t pos = 0) {assert(pos <= _size);for (int i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos; } size_t find(const char* str, size_t pos = 0) {assert(pos <= _size);char* p = strstr(_str + pos, str);if (p == nullptr){return npos;}else{return p - _str;} }clear()
用于将string中的字符串清空的函数
void clear() {_str[0] = '\0';_size = 0; }reserve()
用于改变string容量的函数,一般用于扩容。
void reserve(size_t n) {char* temp = new char[n + 1];strcpy(temp, _str);delete[] _str;_str = temp; _capacity = n; }insert()
向字符串的
pos位置插入字符或者字符串。string& insert(size_t pos, char ch) {assert(pos <= _size);if (_size + 1 > _capacity){reserve(2 * _capacity);}错误问题会导致死循环//size_t end = _size;//while (end > pos)//{// _str[end + 1] = _str[end];// --end;//}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];--end;}_str[pos] = ch;++_size;return *this;}string& insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);//挪动数据size_t end = _size + len;if (_size + len > _capacity){reserve(_size + len);}while (end - len + 1 > pos){_str[end] = _str[end - len];--end;}_size += len;//拷贝数据strncpy(_str + pos, str, len);return *this;}erase()
将字符串
pos位置以及其之后的len长度的字符串都都删掉string& erase(size_t pos, size_t len = npos) {if (len == npos || pos + len >= _size){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}return *this; }resize()
改变字符串的大小,这里给了一个缺省参数,也就是当我们是要增大字符串的大小的时候可以给这个缺省值也可以不给。
void resize(size_t n, char ch = '\0') {if (n < _size){ _size = n;_str[n] = '\0';}else if(n > _size){if (n > _capacity){reserve(n);}int i = _size;while (i < n){_str[i] = ch;++i;}_size = n;_str[n] = '\0';} }pushback()
向字符出串尾部插入字符
void push_back(char ch) {//if (_size + 1 > _capacity)//{// reserve(2 * _capacity);//}//_str[_size] = ch;//++_size;//_str[_size] = '\0';apend(&ch);//insert函数的复用insert(_size, ch); }apend()
向字符串尾部追加字符串
void apend(const char* str) {//int len = strlen(str);//if (_size + len > _capacity)//{// reserve(_size + len);//}//strcpy(_str + _size, str);//_size += len;//insert函数的复用insert(_size, str); }
Ⅲ. 运算符以及输入输出流的重载
①运算符重载
bool operator<(const string& s) const {return strcmp(_str, s._str) < 0; } bool operator==(const string& s) const {return strcmp(_str, s._str) == 0; } bool operator>(const string& s) const {return !(*this < s && *this == s); } bool operator>=(const string& s) const {return *this > s || *this == s; } bool operator<=(const string& s) const {//这里给函数加上const才可以交换s和*this的值//因为不加const的话相当于是用s去调==的函数//但是因为s是一个const类型的,所以是权限的放大//所以结论就是对于不修改成员变量的函数最好加上constreturn *this < s || s == *this; } bool operator!=(const string& s) const {return !(*this == s); } string& operator=(const string& s) {if (this != &s){//delete[] _str;//_str = new char[_capacity + 1];//strcpy(_str, s._str);//_capacity = s._capacity;//_size = s._size;char* temp = new char[_capacity + 1];strcpy(temp, s._str);delete[] _str;_str = temp;_capacity = s._capacity;_size = s._size;}return *this; }②流插入和流输出重载
ostream& operator << (ostream& out, const string& s){for (auto ch : s){out << ch;}return out;}istream& operator >> (istream& in, string& s){s.clear();char ch = in.get();char buff[128];size_t i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){buff[127] = '\0';s += buff;i = 0;} ch = in.get();}if (i != 0){buff[i] = '\0';s += buff;}return in;}
Ⅳ. 迭代器实现
这里只是实现了正向迭代器的实现
typedef char* iterator;typedef 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;}
到这本篇博客的内容就到此结束了。
如果觉得本篇博客内容对你有所帮助的话,可以点赞,收藏,顺便关注一下!
如果文章内容有错误,欢迎在评论区指正

相关文章:
C++类的模拟实现
📟作者主页:慢热的陕西人 🌴专栏链接:C 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 本博客主要内容讲解了简单模拟实现string类 C类的模拟实现 文章目录 C类的…...
耐腐蚀高速电动针阀在半导体硅片清洗机化学药液流量控制中的应用
摘要:化学药液流量的精密控制是半导体湿法清洗工艺中的一项关键技术,流量控制要求所用调节针阀一是开度电动可调、二是具有不同的口径型号、三是高的响应速度,四是具有很好的耐腐蚀性,这些都是目前提升半导体清洗设备性能需要解决…...
助力工业物联网,工业大数据之ODS层及DWD层建表语法【七】
文章目录 ODS层及DWD层构建01:课程回顾02:课程目标03:数仓分层回顾04:Hive建表语法05:Avro建表语法 ODS层及DWD层构建 01:课程回顾 一站制造项目的数仓设计为几层以及每一层的功能是什么? ODS&…...
Windows环境下C++ 安装OpenSSL库 源码编译及使用(VS2019)
参考文章https://blog.csdn.net/xray2/article/details/120497146 之所以多次一举自己写多一篇文章,主要是因为原文内容还是不够详细。而且我安装的时候碰到额外的问题。 1.首先确认一下自己的代码是Win32的还是Win64的,我操作系统是64的,忘…...
TensorFlow高阶API和低阶API
TensorFlow提供了众多的API,简单地可以分类为高阶API和低阶API. API太多太乱也是TensorFlow被诟病的重点之一,可能因为Google的工程师太多了,社区太活跃了~当然后来Google也意识到这个问题,在TensorFlow 2.0中有了很大的改善。本文…...
强训之【参数解析和跳石板】
目录 1.参数解析1.1题目描述1.2思路1.3代码 2.跳石板2.1题目2.2思路2.3代码 3.选择题 1.参数解析 1.1题目描述 在命令行输入如下命令: xcopy /s c:\ d:\e, 各个参数如下: 参数1:命令字xcopy 参数2:字符串/s 参数…...
Redis队列Stream、Redis多线程详解(三)
Redis中的线程和IO模型 什么是Reactor模式 ? “反应”器名字中”反应“的由来: “反应”即“倒置”,“控制逆转”,具体事件处理程序不调用反应器,而向反应器注册一个事件处理器,表示自己对某些事件感兴趣࿰…...
MySQL统计函数count详解
count()概述 count() 是一个聚合函数,返回指定匹配条件的行数。开发中常用来统计表中数据,全部数据,不为null数据,或者去重数据 count(1)和count()和count(列名)的区别 1.函数说明 count(1):统计所有的记录࿰…...
实验04:图像压缩(DP算法)
1.实验目的: 掌握动态规划算法的基本思想以及用它解决问题的一般技巧。运用所熟悉的编程工具,运用动态规划的思想来求解图像压缩问题。 2.实验内容: 给定一幅图像,求解最佳压缩,使得压缩后的文件最小。 3.实验要求…...
4.19--面试系列之真题版本--redis出现大key怎么解决?Redis 大 Key 对持久化有什么影响?
对于redis出现大key的情况,可以通过以下几种方式来解决: 1.分布式存储:将大key拆分成多个小的key,分别存储在不同的节点上。 2.数据过期:对于大key中不经常使用的数据,可以使用redis自带的过期特性…...
新手在家做自媒体要如何起步?
不少人都想做自媒体来增加自己的收入或者创业,但没有人带领,自己像是无头苍蝇一样,不知道往哪里走。 今天这期内容大周就来给粉丝们分享一点干货,如果对你有所帮助,记得点赞支持一下大周。 1、注册账号 如果你连一个…...
易基因:禾本科植物群落的病毒组丰度/组成与人为管理/植物多样性变化的相关性 | 宏病毒组
大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 现代农业通过简化生态系统、引入新宿主物种和减少作物遗传多样性来影响植物病毒的出现。因此,更好理解农业生态中种植和未种植群落中的病毒分布,以及它们之间的病…...
华为OD机试——对称美学(通过率只有8.51%???)
用java写的这道题,两个样例都可以通过,但是提交之后最终的通过率只有8.51%???自己搞了半天一直都是这个通过率,然后用网上说的100%通过率的代码也是一样的结果,最后时间到了还是没有拿到满分&am…...
【三十天精通Vue 3】第十六天 Vue 3 的虚拟 DOM 原理详解
引言 Vue 3 的虚拟 DOM 是一种用于优化 Vue 应用程序性能的技术。它通过将组件实例转换为虚拟 DOM,并在组件更新时递归地更新虚拟 DOM,以达到高效的渲染性能。在 Vue 3 中,虚拟 DOM 树由 VNode 组成,VNode 是虚拟 DOM 的基本单元…...
Arduino ESP8266通过udp获取时间以及同步本地时间方法
Arduino ESP8266通过udp获取时间以及同步本地时间 ✨通过udp获取NTP服务器上的时间戳,然后经过转换,得到当前具体的时间。转换相对复杂,对于获取时间还是相对比较准确。📝通过udp获取时间实现代码 #include <ESP8266WiFi.h> #include <WiFiUdp.h>//填写 WiFi…...
c/c++:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格
c/c:char*定义常量字符串,strcmp()函数,strcpy()函数,寻找指定字符,字符串去空格 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所…...
2023年6月DAMA-CDGA/CDGP数据治理认证考试可报名地区公布
2023年4月23日,据DAMA中国官方信息,目前6月DAMA-CDGA/CDGP数据治理认证考试开放报名地区有:北京、上海、广州、深圳、长沙、呼和浩特。目前南京、济南、西安、杭州等地区还在接近开考人数中,打算6月考试的朋友们可以抓紧时间报名啦…...
UDS的0x19服务介绍
什么是 UDS? UEI (Unified Diagnostic Services,统一诊断服务) 是一种在车辆电子控制单元 (ECU) 之间交换诊断信息的标准通信协议,它是OBD-II的某些扩展。利用 UDS 协议,诊断工程师可以访问车辆的各种功能,如读取故障…...
QinQ技术与Portal技术
QinQ 802.1Q-in-802.1Q,是一种扩展VLAN标签技术。在城域网中,需要大量的VLAN来隔离区分不同的用户,但是原有的802.1Q只有12个比特,仅能标识4096个VLANQinQ即在802.1Q的基础上,再增加一层外层标签。使得可以标识4096*40…...
Vue-自定义表单验证(rule,value,callback)详细使用
前言 最近在实际开发中遇到需要验证合同编号是否在数据库已经存在,自定义表单验证。 的表单验证大家都知道form绑定rules,prop绑定值与form.值一样,必填,失去焦点触发 提示信息。 今天我们讲一讲自定义验证规则具体使用场景和它…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
04-初识css
一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...
算法笔记2
1.字符串拼接最好用StringBuilder,不用String 2.创建List<>类型的数组并创建内存 List arr[] new ArrayList[26]; Arrays.setAll(arr, i -> new ArrayList<>()); 3.去掉首尾空格...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
算法:模拟
1.替换所有的问号 1576. 替换所有的问号 - 力扣(LeetCode) 遍历字符串:通过外层循环逐一检查每个字符。遇到 ? 时处理: 内层循环遍历小写字母(a 到 z)。对每个字母检查是否满足: 与…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
