string类的模拟实现的一些改进

上回我们完成了string类的模拟实现,不过之前写的传统写法本篇,我们将要对其进行一些改进,写成参考的是现代写法,这样写可以提高可读性。

上回我们写好的string类

//string.h

#pragma once#define _CRT_SECURE_NO_WARNINGS 1
#pragma once
#include<iostream>
#include<assert.h>
using namespace std;namespace STring
{class string{public:typedef char* iterator;typedef const char* const_iterator;iterator begin();iterator end();const_iterator begin() const;const_iterator end() const;//string();string(const char* str = "");string(const string& s);string& operator=(const string& s);~string();const char* c_str() const;size_t size() const;char& operator[](size_t pos);const char& operator[](size_t pos) const;void reserve(size_t n);void push_back(char ch);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);size_t find(char ch, size_t pos = 0);size_t find(const char* str, size_t pos = 0);void swap(string& s);string substr(size_t pos = 0, size_t len = npos);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;void clear();private:// char _buff[16];char* _str;size_t _size;size_t _capacity;//  //const static size_t npos = -1;// ֧//const static double N = 2.2;const static size_t npos;};istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);
}

//string.cpp

#include"string.h"
namespace STring
{const size_t string::npos = -1;string::iterator string::begin(){return _str;}string::const_iterator string::begin() const{return _str;}string::iterator string::end(){return _str + _size;}string::const_iterator string::end() const{return _str+_size;}string:: string(const char* str):_size(strlen(str)){_str = new char[_size+1];_capacity = _size+1;strcpy(_str, str);}string::string(const string& s){_str = new char[s._capacity];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}string::~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}const char* string::c_str() const{return _str;}size_t string :: size() const{return _size;}void string::reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void string::push_back(char ch){if (_size == _capacity){size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] = ch;_str[_size + 1] = '\0';++_size;}void string::append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, _str);_size += len;insert(_size, _str);}void string::insert(size_t pos, char ch){assert(pos <= _size);if (_size = _capacity){size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;reserve(newcapacity);}size_t end = _size + 1;while (end > pos){_str[end] = _str[end - 1] + 1;--end;}_str[pos] = ch;++_size;}void string::insert(size_t pos, const char* str){assert(pos <= _size);int len = strlen(str);if (_size + len > _capacity){reserve(_capacity+len);}size_t end = _size + len;while (end > pos+len+1){_str[end] = _str[end - len];--end;}memcpy(_str+pos,str,len);_size += len;}void string::erase(size_t pos, size_t len){assert(pos < _size);if (len >= _size - pos){_str[pos] = '\0';_size = len;}else{strcpy(_str + pos, _str + pos + len);_size = len;}}size_t string::find(char ch, size_t pos){for (size_t i = pos; i < _size; i++){if (_str[i] == ch){return i;}}return npos;}size_t string::find(const char* str, size_t pos){char* p = strstr(_str + pos, str);return p - _str;}void string::swap(string& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);}string string::substr(size_t pos, size_t len){if (len > _size - pos){string sub(_str + pos);return sub;}else{string sub;sub.reserve(len);for (size_t i = 0; i < len; i++){sub += _str[i + pos];}return sub;}}string& string:: operator=(const string& s){if (this != &s){char* tmp = new char[s._capacity];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;}char& string::operator[](size_t pos){if (pos < _size)return _str[pos];}const char& string::operator[](size_t pos) const{if (pos < _size)return _str[pos];}string& string::operator+=(char ch){push_back(ch);return *this;}string& string::operator+=(const char* str){append(str);return *this;}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);}bool string::operator==(const string& s) const{return strcmp(_str, s._str) == 0;}bool string::operator!=(const string& s) const{return !(*this == s);}void string::clear(){_str[0] = '\0';_size = 0;}istream& operator>> (istream& is, string& str){str.clear();char ch = is.get();while (ch != ' ' && ch != '\n'){str += ch;ch = is.get();}return is;}ostream& operator<< (ostream& os, const string& str){for (size_t i = 0; i < str.size(); i++){os << str[i];}return os;}
}

以下是现代写法对于 传统写法的改进

一、push_back

传统写法:

void string::push_back(char ch)
{if (_size == _capacity){size_t newcapacity = _capacity == 0 ? 4 : _capacity * 2;reserve(newcapacity);}_str[_size] = ch;_str[_size + 1] = '\0';++_size;
}

现代写法:

	void string::push_back(char ch){insert(_size, ch);}

二、append

传统写法:

	void string::append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, _str);_size += len;insert(_size, _str);}

现代写法:

	void string::append(const char* str){insert(_size, str);}

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

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

相关文章

常见汇编指令

下面是一些包含汇编指令 MOV、PUSH、POP、LEA、LDS、ADD、ADC、INC、SUB、SBB、DEC、CMP、MUL、DIV、AND、OR、XOR、NOT、TEST、SHL、SAL、SHR、SAR、ROL、ROR、RCL、RCR、LODS、MOVS 的例题。这些例题展示了每条指令的用法及其作用。 1. MOV 指令 MOV AX, BX ; 将寄存器 B…

github stylesmile fastboot介绍

**Fastboot是一个极速的Java Web框架&#xff0c;旨在提供高效的启动速度和低内存占用**。 Fastboot的设计理念是为了让Java应用能够以极短的时间启动&#xff0c;并且占用非常少的内存资源。项目的定位是成为Java领域内最佳的云原生解决方案&#xff0c;为开发者提供一个高效…

像素坐标系与图像坐标系

前言 在数字图像处理中&#xff0c;经常会看到使用 (x, y) 表示图像中的某个像素点。 在一些图像处理库&#xff0c;例如 Pillow 、OpenCV 、Numpy 中也会使用到坐标系处理图像的像素点。 介绍 无论是像素坐标系还是图像坐标系&#xff0c;其原理都是一样的&#xff1a; 以…

[AIGC] BFS算法详解以及实例应用

BFS&#xff08;Breadth-First Search&#xff0c;广度优先搜索&#xff09;是一种用于图的查找算法&#xff0c;可以用来解决许多问题&#xff0c;比如寻找最短路径&#xff0c;检查图是否连通&#xff0c;检查图中是否存在环等。 文章目录 BFS算法的概念BFS算法的步骤BFS示例…

UI学习(二)

UI学习&#xff08;二&#xff09; 文章目录 UI学习&#xff08;二&#xff09;布局子视图手动布局自动布局 导航控制器导航控制器基础导航控制器的切换导航栏工具栏 分栏控制器分栏控制器协议部分的内容UITableView基础部分相关的协议函数高级协议与单元格 多界面传值 布局子视…

C++迈向精通:STL的Deque复现

C迈向精通&#xff1a;STL的Deque复现 最近忙着写一个其他的小玩意&#xff0c;好久没更新博客了&#xff0c;手痒更新一下&#xff1a; 本期来讲一讲C中的STL中的deque的底层实现原理。 deque的地位 STL中的deque的地位很高 主要原因是由于泛型思想和对于其他容器的影响&am…

2024年6月9日 (周日) 叶子游戏新闻

万能嗅探: 实测 网页打开 某视频号、某音、某红薯、某站&#xff0c;可以做到无水印的视频和封面下载功能哦&#xff0c;具体玩法大家自行发挥吧。 《Funko Fusion》发布新预告 20款影视作品齐聚一堂第三人称动作游戏新作《Funko Fusion》今日发布最新实机演示。该游戏融合了整…

Linxu: Dynamic debug 简介

文章目录 1. 前言2. 什么是 Dynamic debug (dyndbg) ?3. Dynamic debug (dyndbg) 的使用3.1 开启 Dynamic debug (dyndbg) 功能3.2 使用 Dynamic debug (dyndbg) 功能 4. Dynamic debug (dyndbg) 的实现4.1 内核接口 dynamic_pr_debug() 的实现4.2 debugfs 导出控制节点 contr…

力扣hot100学习记录(十二)

94. 二叉树的中序遍历 给定一个二叉树的根节点 root&#xff0c;返回它的中序遍历。 题意 给定一个二叉树&#xff0c;返回它的中序遍历 思路 采用递归的思想&#xff0c;只要根节点不为空&#xff0c;则一直递归遍历左子树&#xff0c;然后将根节点的值存入结果&#xff0c;…

AutoCAD Mechanical机械版专业的计算机辅助设计软件安装包下载安装!

AutoCAD机械版作为一款专业的计算机辅助设计软件&#xff0c;不仅具备卓越的二维绘图功能&#xff0c;更是拥有令人瞩目的3D建模工具&#xff0c;为机械设计师们提供了前所未有的创作空间。 在AutoCAD机械版的3D建模环境中&#xff0c;用户可以借助一系列简洁明了的命令&#…

数智融通 创新发展|亚信科技携AntDB、Data OS与隐私计算产品,赋能企业高质量发展

5月21日&#xff0c;亚信科技在云端举办了一场别开生面的研讨会——“数智融通 创新发展”&#xff0c;聚焦企业数智化升级的前沿话题。资深产品经理和技术架构师们面对面深入交流&#xff0c;分享创新成果与实战案例&#xff0c;共同探索企业数智化转型的新路径。 图1&#xf…

网络安全形势与WAF技术分享

我一个朋友的网站&#xff0c;5月份时候被攻击了&#xff0c;然后他找我帮忙看看&#xff0c;我看他的网站、网上查资料&#xff0c;不看不知道&#xff0c;一看吓一跳&#xff0c;最近几年这网络安全形势真是不容乐观&#xff0c;在网上查了一下资料&#xff0c;1、中国信息通…

基础数据结构 -- 栈

1. 简介 堆栈又名栈&#xff08;stack&#xff09;&#xff0c;他是计算机科学中最基础的数据结构之一。可以算是一种受限制的线性结构&#xff0c;&#xff0c;具有后进先出&#xff08;LIFO&#xff0c; Last In First Out&#xff09;的特性。由于此特性&#xff0c;堆栈常用…

在 Zustand 中管理状态能使用类(Class)吗

在 Zustand 中&#xff0c;通常不推荐使用类&#xff08;Class&#xff09;来管理状态&#xff0c;因为 Zustand 的设计理念是基于函数式编程和 React Hooks 的。然而&#xff0c;仍然可以在 Zustand 中间接地使用类&#xff0c;但这并不是 Zustand 的典型用法。 如果确实想要…

(第30天)二叉树阶段总结

目录 1.判断二叉树是否对称或相同统一思路遍历顺序递归和迭代 2.求二叉树的最大深度题目解读递归法逻辑迭代法逻辑 3.求二叉树的最小深度题目解读递归法逻辑遍历法逻辑 4.求二叉树的节点数递归法迭代法 5.判断二叉树是否是平衡二叉树题目解读递归法迭代法 6.求二叉树的所有路径…

OPenCV的重要结构体Mat

一 Mat Mat是什么&#xff1f; Mat有什么好处&#xff1f; class CV_EXPORTS Mat{ public: ... int dims;//维数 int rows,cols;//行列数 uchar *data;//存储数据的指针 int *refcount;//引用计数 ...};二 Mat属性 三 Mat拷贝 1 Mat浅拷贝 Mat A Aimread(file,IMREAD_COLOR) …

【TensorFlow深度学习】状态值函数Vπ与最优策略π∗的求解方法

状态值函数Vπ与最优策略π∗的求解方法 状态值函数Vπ与最优策略π*的求解方法&#xff1a;强化学习中的寻宝图鉴理论基础求解方法代码示例&#xff1a;Value Iteration代码示例&#xff1a;Policy Iteration结语 状态值函数Vπ与最优策略π*的求解方法&#xff1a;强化学习中…

http接口上传文件响应413:413 Request Entity Too Large

目录 一、场景简介二、异常展示三、原因四、解决 一、场景简介 1、服务端有经过nginx代理 2、上传文件超过5M时&#xff0c;响应码为413 3、上传文件小于5M时&#xff0c;上传正常 二、异常展示 三、原因 nginx限制了上传数据的大小 四、解决 扩大nginx上传数据的大小 步…

Linux之文件打包,压缩,解压

打包和压缩 Linux中对文件进行打包&#xff0c;压缩有两种命令 zip&#xff1a;将文件进行压缩 tar&#xff1a;将文件进行打包(通过和其他命令结合&#xff0c;也能实现压缩的功能) 1、tar打包命令 在Linux中&#xff0c;tar命令是一个常用的工具&#xff0c;用于打包和解…

Web前端的工作内容:深度解析与探索

Web前端的工作内容&#xff1a;深度解析与探索 Web前端&#xff0c;作为互联网世界中用户与网站之间的桥梁&#xff0c;承载着丰富的交互体验和视觉呈现。其工作内容涉及多个层面&#xff0c;从基础的页面构建到复杂的交互设计&#xff0c;都需要前端开发者精心打磨。下面&…