当前位置: 首页 > news >正文

【C++课程学习】:string的模拟实现

🎁个人主页:我们的五年

🔍系列专栏:C++课程学习

🎉欢迎大家点赞👍评论📝收藏⭐文章

 

目录

一.string的主体框架:

二.string的分析:

🍔构造函数和析构函数:

🍔迭代器:

🍔赋值运算符重载:

🍔空间扩容:

🍔尾插:

🍔获取_str,_capacity,_size:

 🍔[]重载,随机访问:

🍔在结尾追加字符串

🍔在指定位置插入和删除字符串:

🍔交换:

🍔获取子串和寻找元素和字符串:

🍔运算符重载:

🍔流插入和流提取重载:


通过对string的模拟实现,可以对string有更深的理解和认识,大概知道底层的逻辑,以后出现什么问题可以更好的解决。对学习以后的容器也有很大的帮助。

 

一.string的主体框架:

1.迭代器        2.运算符重载        3.

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<cstring>
#include<assert.h>
#include<algorithm>using namespace std;namespace bit {class string {public://迭代器typedef char* iterator;typedef const char* const_iterator;iterator begin();const_iterator begin()const;iterator end();const_iterator end()const;//构造函数string(size_t capacity = 4);string(const string& s);string(const char* str);string& operator=(const string& str);//析构函数~string();//异地扩容void reserve(size_t newcapacity);//尾插数据void push_back(char c);const char* c_str()const;size_t size()const;size_t capacity()const;char& operator[](size_t pos);const char& operator[](size_t pos)const;void append(const char* str);string& operator+=(char ch);string& operator+=(const char* str);void insert(size_t pos, char ch);void insert(size_t pos, const char* str);void erase(size_t pos = 0, size_t len = npos);void swap(string& s);string substr(size_t pos = 0, size_t len = npos);size_t find(char ch, size_t pos = 0);size_t find(const char* str, size_t pos = 0);//运算符重载bool operator<(const string& s) const;bool operator>(const string& s) const;bool operator<=(const string& s) const;bool operator>=(const string& s) const;bool operator==(const string& s) const;bool operator!=(const string& s) const;//对sring进行清理void clear();private:const static size_t npos = -1;char* _str;//有效大小size_t _size;//空间的容量size_t _capacity;};//重载流插入和流提取istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);
}

二.string的分析:

🍔构造函数和析构函数:

构造函数常用的是三个,普通构造,拷贝构造,用const char*类型进行构造。

	//capacity表示要提前开的空间大小string::string(size_t capacity):_str(new char[capacity + 1]), _capacity(capacity), _size(0){_str[0] = '\0';}//拷贝构造string::string(const string& s){_capacity = s._capacity;_size = s._size;_str = new char[_capacity + 1];strcpy(_str, s._str);}string::string(const char* str){size_t length = strlen(str);_str = new char[length + 1];_capacity = _size = length;strcpy(_str, str);}string::~string(){delete[] _str;_str = nullptr;_capacity = _size = 0;}

🍔迭代器:

		//迭代器typedef char* iterator;typedef const char* const_iterator;iterator begin();const_iterator begin()const;iterator end();const_iterator end()const;

🍔赋值运算符重载:

	string& string::operator=(const string& str){if (str._capacity > _capacity)reserve(str._capacity);strcpy(_str, str._str);return *this;}

🍔空间扩容:

	void string::reserve(size_t newcapacity){//先判断是否需要扩容//如果newcapacity小于等于,就不会扩,也不会缩容if (newcapacity <= _capacity)return;char* p = new char[newcapacity + 1];_capacity = newcapacity;strcpy(p, _str);delete[] _str;_str = p;}

🍔尾插:

	void string::push_back(char c){if (_size == _capacity){//不能直接乘以两倍,_capacity可能为0,乘二还是为0size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] = c;_size++;}

🍔获取_str,_capacity,_size:

	const char* string:: c_str()const{return _str;}size_t string::size()const{return _size;}size_t string::capacity()const{return _capacity;}

 🍔[]重载,随机访问:

	char& string::operator[](size_t pos){assert(pos >= 0 && pos < _size);return _str[pos];}const char& string::operator[](size_t pos)const{assert(pos >= 0 && pos < _size);return _str[pos];}

🍔在结尾追加字符串

	void string::append(const char* s){size_t length = strlen(s);if(_size + length > _capacity)reserve(_size + length);//strcat(_str, s);_size += length;}

🍔在指定位置插入和删除字符串:

	void string::insert(size_t pos, char ch){assert(pos >= 0 && pos <= _size);if (_size == _capacity)reserve(_capacity * 2);size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1];end--;}_size++;_str[pos] = ch;}void string::insert(size_t pos, const char* str){assert(pos >= 0 && pos <= _size);size_t length = strlen(str);if (length + _size > _capacity)reserve(length + _size);for (size_t i = _size - 1; i >= pos; i--)_str[i + length] = _str[i];_str[_size + length] = 0;for (size_t i = 0; i < length; i++)_str[i + pos] = str[i];}void string::erase(size_t pos, size_t len){assert(pos >= 0 && pos < _size - 1);if (len>=_size-pos){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}}

🍔交换:

	void string::swap(string& s){std::swap(s._capacity, _capacity);std::swap(s._size, _size);std::swap(s._str, _str);}

🍔获取子串和寻找元素和字符串:

	string string::substr(size_t pos, size_t len){assert(pos >= 0 && pos < _size);if (len > _size - pos){bit::string substr(_str + pos);return substr;}else{bit::string substr(len);for (size_t i = pos; i < pos+len; i++)substr += _str[i];return substr;}}size_t string::find(char ch, size_t pos){for (size_t i = 0; i < pos; i++){if (_str[i] == ch)return i;}return -1;}size_t string::find(const char* str, size_t pos){char* p = strstr(_str + pos, str);return p - _str;}

🍔运算符重载:

	bool string::operator<(const string& s) const{return strcmp(_str, s._str)<0;}bool string::operator>(const string& s) const{return !((*this) <= s);}bool string::operator<=(const string& s) const{return ((*this) < s || (*this) == s);}bool string::operator>=(const string& s) const{return ((*this) > s || (*this) == s);}bool string::operator==(const string& s) const{return strcmp(_str, s._str) == 0;}bool string::operator!=(const string& s) const{return !((*this) == s);}string& string::operator+=(char ch){insert(_size, ch);return *this;}string& string::operator+=(const char* str){insert(_size, str);return *this;}

🍔流插入和流提取重载:

	istream& operator>>(istream& is, string& s){s.clear();char it = is.get();while (it != ' ' && it != '\n'){s += it;it = is.get();}return is;}ostream& operator<<(ostream& os, const string& s){for (size_t i = 0; i < s.size(); i++)os << s[i];return os;}

 

相关文章:

【C++课程学习】:string的模拟实现

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;C课程学习 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一.string的主体框架&#xff1a; 二.string的分析&#xff1a; &#x1f354;构造函数和析构函数&a…...

Linux(VMware + CentOS )设置固定ip

需求&#xff1a;设置ip为 192.168.88.130 先关闭虚拟机 启动虚拟机 查看当前自动获取的ip 使用 FinalShell 通过 ssh 服务远程登录系统&#xff0c;更换到 root 用户 修改ip配置文件 vim /etc/sysconfig/network-scripts/ifcfg-ens33 重启网卡 systemctl restart network …...

安卓 android studio各版本下载地址(官方)

https://developer.android.google.cn/studio/archive 别用中文&#xff0c;右上角的语言切换成英文...

如何在一个 Docker 容器中运行多个进程 ?

在容器化的世界里&#xff0c;Docker 彻底改变了开发人员构建、发布和运行应用程序的方式。Docker 容器封装了运行应用程序所需的所有依赖项&#xff0c;使其易于跨不同环境一致地部署。然而&#xff0c;在单个 Docker 容器中管理多个进程可能具有挑战性&#xff0c;这就是 Sup…...

poetry 配置多个cuda环境心得

操作系统&#xff1a;ubuntu22.04 LTS python版本&#xff1a;3.12.7 最近学习了用poetry配置python虚拟环境&#xff0c;当为不同的项目配置cuda时&#xff0c;会遇到不同的项目使用的cuda版本不一致的情况。 像torch 这样的库&#xff0c;它们会对cuda-toolkit有依赖&…...

网络编程入门

目录 1.网络编程入门 1.1 网络编程概述【理解】 1.2 网络编程三要素【理解】 1.3 IP地址【理解】 1.4InetAddress【应用】 1.5端口和协议【理解】 2.UDP通信程序 2.1 UDP发送数据【应用】 2.2UDP接收数据【应用】 2.3UDP通信程序练习【应用】 3.TCP通信程序 3.1TCP…...

Linux-socket详解

Linux-socket详解_socket linux-CSDN博客...

SQL Server 2022安装要求(硬件、软件、操作系统等)

SQL Server 2022安装要求 1、硬件要求2、软件要求3、操作系统支持4、Server Core 支持5、跨语言支持6、磁盘空间要求 1、硬件要求 以下内存和处理器要求适用于所有版本的 SQL Server&#xff1a; 组件要求存储SQL Server 要求最少 6 GB 的可用硬盘驱动器空间。 磁盘空间要求随…...

“众店模式”:创新驱动下的商业新生态

在数字化浪潮的推动下&#xff0c;传统商业模式正经历着前所未有的转型。“众店模式”作为一种新兴的商业模式&#xff0c;以其独特的商业逻辑和创新的玩法&#xff0c;为商家和消费者构建了一个共赢的商业新生态。 一、“众店模式”的核心构成 “众店模式”的成功&#xff0…...

54. 螺旋矩阵

https://leetcode.cn/problems/spiral-matrix/description/?envTypestudy-plan-v2&envIdtop-100-liked观察示例中的输出轨迹我们可以想到如下设计&#xff1a; 1.在朝某一方向行进到头后的改变方向是确定的&#xff0c;左->下&#xff0c;下->右&#xff0c;右->…...

剧本杀小程序,市场发展下的新机遇

剧本杀作为休闲娱乐的一种游戏方式&#xff0c;在短时间内进入了大众视野中&#xff0c;受到了广泛关注。近几年&#xff0c;剧本杀行业面临着创新挑战&#xff0c;商家需求寻求新的发展机遇&#xff0c;在市场饱和度下降的趋势下&#xff0c;获得市场份额。 随着科技的不断进…...

【系统架构设计师】论文:论基于 ABSD 的软件开发

更多内容请见: 备考系统架构设计师-专栏介绍和目录 文章目录 摘要正文摘要 2022年5月,我就职的公司承接了xx的智慧党建工作,建设“党建红云” 系统,为xx公司的党组织提供觉务管理、服务功能,促进党员学习和党组织交流。我在该项目中承担架构设计师的职责,主导需求分析和…...

为什么OLED透明屏在同类产品中显示效果最好

说起OLED透明屏&#xff0c;这家伙在同类产品里那真的是“一枝独秀”啊&#xff01;为啥这么说呢&#xff1f;且听我细细道来。 首先&#xff0c;OLED透明屏的透明度那是杠杠的&#xff01;它不像传统显示屏那样有个固定的背景&#xff0c;而是可以实现像素级的透明效果。这样一…...

深度学习基础知识-Batch Normalization(BN)超详细解析

一、背景和问题定义 在深层神经网络&#xff08;Deep Neural Networks, DNNs&#xff09;中&#xff0c;层与层之间的输入分布会随着参数更新不断发生变化&#xff0c;这种现象被称为内部协变量偏移&#xff08;Internal Covariate Shift&#xff09;。具体来说&#xff0c;由…...

基于单片机的燃气报警阀门系统

本设计基于单片机的燃气报警阀门系统&#xff0c;燃气报警阀门系统采用STM32主控制器为核心芯片&#xff0c;外围电路由燃气传感器、OLED液晶显示模块、按键模块、蜂鸣器报警模块、电磁阀以及SIM800模块等模块组成。燃气传感器模块负责采集燃气浓度数据&#xff0c;采集完成由S…...

watch与computed的区别、运用的场景

computed和watch都是响应式数据变化的重要机制&#xff0c;但它们在功能、使用场景和性能表现上有显著的区别。 主要区别 功能和用途 1、computed&#xff1a;计算属性&#xff0c;用于基于其他数据属性进行计算&#xff0c;并返回一个结果。它具有缓存机制&#xff0c;只有当…...

【ESP32+MicroPython】开发环境部署

本教程将指导你如何在Visual Studio Code&#xff08;VSCode&#xff09;中设置ESP32的MicroPython开发环境。我们将涵盖从安装Python到烧录MicroPython固件的整个过程&#xff0c;以及如何配置VSCode以便与ESP32进行交互。 准备工作 安装Python 确保你的计算机上安装了Pyth…...

Vision - 开源视觉分割算法框架 Grounded SAM2 配置与推理 教程 (1)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/143388189 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Ground…...

DAY21|二叉树Part08|LeetCode: 669. 修剪二叉搜索树、108.将有序数组转换为二叉搜索树、538.把二叉搜索树转换为累加树

目录 LeetCode: 669. 修剪二叉搜索树 基本思路 C代码 LeetCode: 108.将有序数组转换为二叉搜索树 基本思路 C代码 LeetCode: 538.把二叉搜索树转换为累加树 基本思路 C代码 LeetCode: 669. 修剪二叉搜索树 力扣代码链接 文字讲解&#xff1a;LeetCode: 669. 修剪二叉搜…...

在gitlab,把新分支替换成master分支

1、备份master分支&#xff0c;可以打tag 2、删除master分支 正常情况下&#xff0c;master分支不允许删除&#xff0c;需要做两个操作才能删除 a、变更项目默认分支为非master分支&#xff0c;可以先随便选择 b、取消master为非保护分支 操作了上述两步&#xff0c;就可以删…...

15分钟掌握OpenShamrock:基于Xposed的OneBot QQ机器人实战指南

15分钟掌握OpenShamrock&#xff1a;基于Xposed的OneBot QQ机器人实战指南 【免费下载链接】OpenShamrock A Bot Framework based on Xposed with OneBot11 项目地址: https://gitcode.com/gh_mirrors/op/OpenShamrock 开篇亮点展示 OpenShamrock是一款基于LSPosed框架…...

告别数学恐惧:用Python可视化单相PWM整流器的dq变换过程

用Python动画拆解单相PWM整流器的坐标变换魔法 1. 从交流到直流的控制艺术 当我们面对单相PWM整流器的控制问题时&#xff0c;最令人着迷的挑战莫过于如何将交流系统中的正弦量转化为适合控制的直流量。这就像是要在汹涌的交流海浪中建造一个稳定的直流岛屿。传统三相系统可以…...

AugmentCode无限续杯插件:突破登录限制的自动化解决方案

AugmentCode无限续杯插件&#xff1a;突破登录限制的自动化解决方案 【免费下载链接】free-augment-code AugmentCode 无限续杯浏览器插件 项目地址: https://gitcode.com/gh_mirrors/fr/free-augment-code 痛点解析&#xff1a;开发者的账户管理困境 在软件开发与测试…...

FRP内网穿透实战:5分钟搞定Linux服务器+Docker部署(含HTTPS配置)

FRP内网穿透实战&#xff1a;Linux服务器与Docker部署全指南 引言 在当今分布式开发和远程办公的浪潮中&#xff0c;内网穿透技术已成为开发者工具箱中不可或缺的一部分。想象一下这样的场景&#xff1a;你正在本地开发一个Web应用&#xff0c;需要让远方的同事实时预览效果&am…...

translategemma-4b-it快速入门:Ollama部署图文翻译模型,开箱即用

translategemma-4b-it快速入门&#xff1a;Ollama部署图文翻译模型&#xff0c;开箱即用 1. 认识translategemma-4b-it 1.1 什么是translategemma-4b-it translategemma-4b-it是Google基于Gemma 3架构开发的开源多模态翻译模型。与普通翻译工具不同&#xff0c;它不仅能处理…...

人工智能应用- 人工智能风险与伦理:01.数据安全

图: 人脸识别的滥用可能带来隐私风险&#xff0c;为不法分子提供可乘之机。特别是无处不在的摄像头&#xff0c;使我们的人脸生物信息可能暴露在风险中&#xff0c;被非法采集。人工智能的广泛应用离不开对数据的采集与分析&#xff0c;但也因此带来了数据安全方面的担忧。人工…...

高效掌握多步提示工程:进阶AI任务处理的系统方法论

高效掌握多步提示工程&#xff1a;进阶AI任务处理的系统方法论 【免费下载链接】LangGPT LangGPT: Empowering everyone to become a prompt expert! &#x1f680; &#x1f4cc; 结构化提示词&#xff08;Structured Prompt&#xff09;提出者 &#x1f4cc; 元提示词&#x…...

3步掌握DDrawCompat:轻松解决Windows老游戏兼容性的终极方案

3步掌握DDrawCompat&#xff1a;轻松解决Windows老游戏兼容性的终极方案 【免费下载链接】DDrawCompat DirectDraw and Direct3D 1-7 compatibility, performance and visual enhancements for Windows Vista, 7, 8, 10 and 11 项目地址: https://gitcode.com/gh_mirrors/dd/…...

cool-admin(midway版)后端日志管理:日志聚合与集中式存储终极指南

cool-admin(midway版)后端日志管理&#xff1a;日志聚合与集中式存储终极指南 【免费下载链接】cool-admin-midway &#x1f525; cool-admin(midway版)一个很酷的后台权限管理框架&#xff0c;模块化、插件化、CRUD极速开发&#xff0c;永久开源免费&#xff0c;基于midway.js…...

ReadCat:开源无广告小说阅读器,为深度阅读者打造纯净体验

ReadCat&#xff1a;开源无广告小说阅读器&#xff0c;为深度阅读者打造纯净体验 【免费下载链接】read-cat 一款免费、开源、简洁、纯净、无广告的小说阅读器 项目地址: https://gitcode.com/gh_mirrors/re/read-cat 在信息爆炸的时代&#xff0c;找到一款无广告、界面…...