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

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);}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • R语言探索与分析18-基于时间序列的汇率预测
  • Spring Cloud Gateway CORS 跨域方案
  • 引入Springcloud--Sleuth-链路追踪中MDC是如何获取到traceid和何时放入traceid的
  • 用动态IP采集数据总是掉线是为什么?该怎么解决?
  • R语言探索与分析19-CPI的分析和研究
  • C++迈向精通:STL的Deque复现
  • 前端面试项目细节重难点(已工作|做分享)想(八)
  • Ubuntu22.04之解决:terminal使用alt+1/alt+2/alt+3失效问题(二百三十八)
  • 自然语言处理(NLP)—— 自动摘要
  • 【手推公式】如何求SDE的解(附录B)
  • 爬虫——有道云翻译
  • QTGUI编程入门:解锁图形用户界面设计的奥秘
  • 知识图谱的应用---智能电网
  • Python使用Flask构建简单的web应用
  • 二叉树—leetcode
  • 【React系列】如何构建React应用程序
  • Git初体验
  • JavaScript函数式编程(一)
  • LeetCode18.四数之和 JavaScript
  • linux安装openssl、swoole等扩展的具体步骤
  • MD5加密原理解析及OC版原理实现
  • mongodb--安装和初步使用教程
  • Mysql数据库的条件查询语句
  • SpiderData 2019年2月25日 DApp数据排行榜
  • Spring-boot 启动时碰到的错误
  • 每天一个设计模式之命令模式
  • 智能合约开发环境搭建及Hello World合约
  • 容器镜像
  • 通过调用文摘列表API获取文摘
  • ​【已解决】npm install​卡主不动的情况
  • ‌内网穿透技术‌总结
  • (+4)2.2UML建模图
  • (aiohttp-asyncio-FFmpeg-Docker-SRS)实现异步摄像头转码服务器
  • (js)循环条件满足时终止循环
  • (八)c52学习之旅-中断实验
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (顺序)容器的好伴侣 --- 容器适配器
  • (原)本想说脏话,奈何已放下
  • (转)菜鸟学数据库(三)——存储过程
  • (轉)JSON.stringify 语法实例讲解
  • (最完美)小米手机6X的Usb调试模式在哪里打开的流程
  • ******之网络***——物理***
  • .NET C# 配置 Options
  • .Net Web项目创建比较不错的参考文章
  • .NET 分布式技术比较
  • .net6解除文件上传限制。Multipart body length limit 16384 exceeded
  • .net访问oracle数据库性能问题
  • @JsonFormat与@DateTimeFormat注解的使用
  • [ linux ] linux 命令英文全称及解释
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [20150707]外部表与rowid.txt
  • [AHK] WinHttpRequest.5.1报错 0x80092004 找不到对象或属性
  • [BT]BUUCTF刷题第8天(3.26)
  • [BZOJ] 2427: [HAOI2010]软件安装
  • [BZOJ1089][SCOI2003]严格n元树(递推+高精度)