【C++】手撕string思路梳理

目录

基本思路

代码实现

1.构建框架:

2.构建函数重载

3.迭代器:

4.遍历string

5.resetve 开空间,insert任意位置插入push_back,append,+=(按顺序依次实现)

6.erase删除,clear清除,resize缩容

7.流插入,流提取

全部代码


本文是对模拟string步骤进行梳理 若要详细讲解请跳转至:【C++】string模拟-CSDN博客

string讲解:【C++】String类-CSDN博客

基本思路

  1. 构建string类框架

    构造函数, 拷贝构造,析构,返回字符串的 C 风格表示,返回字符串长度,返回总容量

  2. 构建函数重载

    operator=,operator[],> == >= < <= !=

  3. 迭代器:

    begin() && end()

  4. 遍历string

  5. resetve 开空间,insert任意位置插入,push_back,append,+=,交换

  6. erase删除,clear清除,resize缩容

  7. 流插入,流提取

代码实现

1.构建框架:

 
class string{private:char *_str;size_t _size;size_t _capacity;public:string(const char *str = ""): _size(strlen(str)){_capacity = _size = 0 ? 3 : _size;_str = new char[_size + 1];strcpy(_str, str);}​// 拷贝string(const string &s): _size(s._size), _capacity(s._capacity){_str = new char[_capacity + 1];strcpy(_str, s._str);}​~string(){delete[] _str;_str = nullptr;_capacity = _size = 0;}const char *c_str(){return _str;}//?size_t size() const // const?{return _size;}size_t capacity() const{return _capacity;}};

2.构建函数重载

 string &operator=(const string &s){if (this != &s){char *tmp = new char[s._capacity + 1];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;}​char &operator[](size_t pos){assert(pos < _size);return _str[pos];}​const char &operator[](size_t pos) const{assert(pos < _size);return _str[pos];}​bool operator<(string &s) const{return strcmp(_str, s._str) < 0;}bool operator==(string &s) const{return strcmp(_str, s._str) == 0;}bool operator<=(string &s) const{return *this < s || *this == s;}bool operator>(string &s) const{return !(*this <= s);}bool operator>=(string &s) const{return !(*this < s);}bool operator!=(string &s) const{return !(*this == s);}

3.迭代器:

 typedef char *iterator;typedef const char *const_iterator;​iterator begin(){return _str;}iterator end(){return _str + _size;}

4.遍历string

 void Print(const string &s){//方法1for (size_t i = 0; i < s.size(); i++){cout << s[i] << " ";}cout << endl;//方法二:迭代器遍历const_iterator rit = s.begin();while (rit != s.end()){cout << *rit << " ";++rit;}}

5.resetve 开空间,insert任意位置插入push_back,append,+=(按顺序依次实现)

 void reserve(size_t n){if (n > _capacity){char *tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}​string &insert(size_t pos, char ch){assert(pos <= _size);// 判断大小if (_size + 1 > _capacity){reserve(2 * _capacity);}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);if (_size + len > _capacity){reserve(_size + len);}size_t end = _size + len;while (end > pos + len - 1){_str[end - len] = _str[end];--end;}strncpy(_str + pos, str, end);_size += len;​return *this;}​void push_back(char ch){insert(_size, ch);}​void append(const char *str){insert(_size, str);}​string &operator+=(char ch){push_back(ch);return *this;}​string &operator+=(const char *str){append(str);return *this;}
交换:void swap(string &s){std::swap(_str, s._str);std::swap(_capacity, s._capacity);std::swap(_size, s._size);}

6.erase删除,clear清除,resize缩容

 string &erase(size_t pos, size_t len = npos){assert(pos < _size);if (len == npos || len >= _size){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}return *this;}​void resize(size_t n, char ch = '\0'){if (n < _size){_size = n;_str[_size] = '\0';}else if (n > _size){if (n > _capacity){reserve(n);}size_t i = _size;while (i < n){_str[i] = ch;++i;}_size = n;_size = '\0';}}​void clear(){_str[0] = '\0';_size = 0;}

7.流插入,流提取

 ostream &operator<<(ostream &out, const string &s){for (size_t i = 0; i < s.size(); ++i){out << s[i];}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] = ch;buff[i + 1] = '\0';s += buff;}return in;}

全部代码

string.h

 #include <iostream>#include <assert.h>using namespace std;​namespace wzf{class string{private:char *_str;size_t _size;size_t _capacity;​static size_t npos;​public: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;}​string(const char *str = ""): _size(strlen(str)){_capacity = _size = 0 ? 3 : _size;_str = new char[_size + 1];strcpy(_str, str);}​// 拷贝string(const string &s): _size(s._size), _capacity(s._capacity){_str = new char[_capacity + 1];strcpy(_str, s._str);}​~string(){delete[] _str;_str = nullptr;_capacity = _size = 0;}​string &operator=(const string &s){if (this != &s){char *tmp = new char[s._capacity + 1];strcpy(tmp, s._str);delete[] _str;_str = tmp;_size = s._size;_capacity = s._capacity;}return *this;}​char &operator[](size_t pos){assert(pos < _size);return _str[pos];}​const char &operator[](size_t pos) const{assert(pos < _size);return _str[pos];}​bool operator<(string &s) const{return strcmp(_str, s._str) < 0;}bool operator==(string &s) const{return strcmp(_str, s._str) == 0;}bool operator<=(string &s) const{return *this < s || *this == s;}bool operator>(string &s) const{return !(*this <= s);}bool operator>=(string &s) const{return !(*this < s);}bool operator!=(string &s) const{return !(*this == s);}​void reserve(size_t n){if (n > _capacity){char *tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}​string &insert(size_t pos, char ch){assert(pos <= _size);// 判断大小if (_size + 1 > _capacity){reserve(2 * _capacity);}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);if (_size + len > _capacity){reserve(_size + len);}size_t end = _size + len;while (end > pos + len - 1){_str[end - len] = _str[end];--end;}strncpy(_str + pos, str, end);_size += len;​return *this;}​void push_back(char ch){insert(_size, ch);}​void append(const char *str){insert(_size, str);}​string &operator+=(char ch){push_back(ch);return *this;}​string &operator+=(const char *str){append(str);return *this;}​string &erase(size_t pos, size_t len = npos){assert(pos < _size);if (len == npos || len >= _size){_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}return *this;}​void resize(size_t n, char ch = '\0'){if (n < _size){_size = n;_str[_size] = '\0';}else if (n > _size){if (n > _capacity){reserve(n);}size_t i = _size;while (i < n){_str[i] = ch;++i;}_size = n;_size = '\0';}}​void clear(){_str[0] = '\0';_size = 0;}​const char *c_str(){return _str;}//?size_t size() const // const?{return _size;}size_t capacity() const{return _capacity;}};size_t string::npos = -1;​ostream &operator<<(ostream &out, const string &s){for (size_t i = 0; i < s.size(); ++i){out << s[i];}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] = ch;buff[i + 1] = '\0';s += buff;}return in;}​void TestString1(){string s1("Hello");cout << s1.c_str() << endl;string s2 = s1;string s3(s1);cout << s3.c_str() << endl;s1[0]++;cout << s1.c_str() << endl;}void TestString2(){string s1("Hello");cout << s1.c_str() << endl;string s2("NI");cout << (s1 > s2) << endl;cout << (s1 >= s2) << endl;cout << (s1 == s2) << endl;cout << (s1 != s2) << endl;cout << (s1 <= s2) << endl;}void TestString3(){string s1("Hello");cout << s1.c_str() << endl;s1 += '!';s1 += "2345";cout << s1.c_str() << endl;}void TestString4(){string s1("HelloWord");string s2("HelloWord");s1.erase(3, 1);cout << s1.c_str() << endl;s1.erase(3, 100);cout << s1.c_str() << endl;s2.resize(4);cout << s2.c_str() << endl;s2.resize(10, 'x');cout << s2.c_str() << endl;}void TestString5(){string s1("HelloWord");cout << s1 << endl;cin >> s1;string::iterator it = s1.begin();while (it != s1.end() - 1){cout << *it << "";++it;}cout << endl;}}

string.cpp

 #include "string.h"​int main(){try // char* tmp = new char[s._capacity + 1];是否开辟异常{wzf::TestString5();}catch (const std::exception &e){std::cerr << e.what() << '\n';}​return 0;}

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

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

相关文章

Java集合使用注意事项

目录 1. 集合判空 2. 集合转 Map 3. 集合遍历 4. 集合去重 5. 集合转数组 6. 数组转集合 1. 集合判空 《阿里巴巴 Java 开发手册》的描述如下&#xff1a; 判断所有集合内部的元素是否为空&#xff0c;使用 isEmpty() 方法&#xff0c;而不是 size()0 的方式。 这是因为…

FreeRTOS系统延时函数分析

一、概述 FreeRTOS提供了两个系统延时函数&#xff0c;相对延时函数vTaskDelay()和绝对延时函数vTaskDelayUntil()。相对延时是指每次延时都是从任务执行函数vTaskDelay()开始&#xff0c;延时指定的时间结束&#xff0c;绝对延时是指每隔指定的时间&#xff0c;执行一次调用vT…

项目分析:解决类的复杂设计中遇到的问题

1.问题1&#xff1a;析构函数乱码问题 【样例输入】 -3 1 3 -1 -3 2 3 -2 【样例输出】 gouzao 1 -3 1 3 -1 gouzao 2 -3 2 3 -2 -3 1 3 -1 -3 2 3 -2 9.4245 18.849 Ellipse xigou 3 -2 Point xigou 3 -2 Point xigou -3 2 Point xigou 3 -2 Point xigou -3 2…

2023年阿里云云栖大会-核心PPT资料下载

一、峰会简介 历经14届的云栖大会&#xff0c;是云计算产业的建设者、推动者、见证者。2023云栖大会以“科技、国际、年轻”为基调&#xff0c;以“计算&#xff0c;为了无法计算的价值”为主题&#xff0c;发挥科技平台汇聚作用&#xff0c;与云计算全产业链上下游的先锋代表…

关于mysql高版本使用groupby导致的报错

在开发时&#xff0c;遇到mysql版本在5.7.X及以上版本时使用group by 语句会报以下的错误 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column business_typ…

使用pandas制作图表

数据可视化对于数据分析的重要性不言而喻&#xff0c;一个优秀的图表有足以一眼就看出关键所在。pandas利用matplotlib实现绘图。能够提供各种各样的图表功能&#xff0c;包括: 单折线图多折线图柱状图叠加柱状图水平叠加柱状图直方图拆分直方图箱型图区域块图形散点图饼图多子…

13年测试老鸟总结,性能测试常遇问题+解决方案+分析...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、内存溢出 1&a…

【高数:1 映射与函数】

【高数&#xff1a;1 映射与函数】 例2.1 绝对值函数例2.2 符号函数例2.3 反函数表示例2.4 双曲正弦sinh&#xff0c;双曲余弦cosh&#xff0c;双曲正切tanh 参考书籍&#xff1a;毕文斌, 毛悦悦. Python漫游数学王国[M]. 北京&#xff1a;清华大学出版社&#xff0c;2022. 例2…

设计之初,成就AI创作的非凡之路——AI绘画

一.官方活动 活动链接&#xff1a;| 2023腾讯云 AI 绘画有奖征文大赛&#xff0c;秀出你的AI新质生产力 https://cloud.tencent.com/developer/article/2367375 二.产品体验 1.产品链接:https://cloud.tencent.com/act/pro/AIhuihua?from20421&from_column20421 2.产品…

vue实现父子传参

1.父向子进行传值 在父组件中&#xff0c;使用子组件的标签&#xff0c;并通过属性将数据传递给子组件。 在子组件中&#xff0c;定义props选项来接收父组件传递的数据。 父组件的数据会通过props选项传递给子组件&#xff0c;子组件可以直接使用这些数据。 父组件&#xf…

Maven-高效的Java项目构建与管理工具(含Maven详细安装与配置过程)

Maven 什么是Maven&#xff1f; 正如题目所说&#xff0c;Maven就是一款高效的Java项目构建与管理工具&#xff0c;基于项目对象模型&#xff08;POM&#xff09;概念&#xff0c;利用一个中央信息片断能管理一个项目的构建、报告和文档等步骤。是Apache软件基金会的一个开源…

网站测试都要测试哪些?如何进行测试?

1 UI测试 看页面是否美观养眼(包括页面的布局是否合理&#xff0c;策划是否舒服美观&#xff0c;页面长度是否合理&#xff0c;前景色与背景色是否搭配&#xff0c;页面风格是否统一&#xff0c;色调是否适合人眼&#xff0c;会不会太刺眼&#xff0c;字体大小是否合适&#x…

Java多线程:代码不只是在‘Hello World‘

Java线程好书推荐 概述01 多线程对于Java的意义02 为什么Java工程师必须掌握多线程03 Java多线程使用方式04 如何学好Java多线程写在末尾&#xff1a; 主页传送门&#xff1a;&#x1f4c0; 传送 概述 摘要&#xff1a;互联网的每一个角落&#xff0c;无论是大型电商平台的秒杀…

IntelliJ IDEA图形安装教程

IntelliJ IDEA图形安装教程 之前开始Java程序&#xff0c;一直用的eclipse&#xff0c;觉得还可以。一直听说IntelliJ IDEA比eclipse好用很多&#xff0c;但因为比较懒&#xff0c;也没有学习使用。机缘巧合下&#xff0c;尝试用了下&#xff0c;顿时有种相见恨晚的感觉&#…

【问题思考】泰勒公式证明题如何选展开点?【对称美】

我的证明题水平很烂&#xff0c;这个纯属让自己有一个初步的理解&#xff0c;恳请指正&#xff01; 问题 我们可以看到这里有两种展开方式&#xff08;注意&#xff1a;x0叫展开点&#xff09;&#xff0c;分别是正确的做法&#xff0c;在x0展开&#xff0c;然后将0和a代入fx中…

聊聊java的两种锁同步锁和重入锁

java重入锁和同步锁有什么区别 在Java中&#xff0c;重入锁&#xff08;ReentrantLock&#xff09;和同步锁&#xff08;Synchronized&#xff09;都是用于实现线程同步的机制&#xff0c;但它们有一些区别。 可重入性&#xff1a; 重入锁是可重入的&#xff0c;也就是说&…

Windows系统上如何搭建Linux操作系统

一、准备工作 1&#xff0c;VMware安装包 2&#xff0c;Centos IOS镜像 3&#xff0c;finalshell安装包 阿里云盘下载地址&#xff1a; https://www.alipan.com/s/uSQsWn15E3W 二&#xff0c;VMware安装 1&#xff0c;新建虚拟机 2&#xff0c;选择下一步 3&#xff0c;…

如何在Linux上部署1Panel运维管理面板并远程访问内网Web端管理界面

文章目录 前言1. Linux 安装1Panel2. 安装cpolar内网穿透3. 配置1Panel公网访问地址4. 公网远程访问1Panel管理界面5. 固定1Panel公网地址 前言 1Panel 是一个现代化、开源的 Linux 服务器运维管理面板。高效管理,通过 Web 端轻松管理 Linux 服务器&#xff0c;包括主机监控、…

Course1-Week3-分类问题

Course1-Week3-分类问题 文章目录 Course1-Week3-分类问题1. 逻辑回归1.1 线性回归不适用于分类问题1.2 逻辑回归模型1.3 决策边界 2. 逻辑回归的代价函数3. 实现梯度下降4. 过拟合与正则化4.1 线性回归和逻辑回归中的过拟合4.2 解决过拟合的三种方法4.3 正则化4.4 用于线性回归…

揭秘:微信淘宝客自动查券找券返利机器人的工作原理与实现思路

揭秘&#xff1a;微信淘宝客自动查券找券返利机器人的工作原理与实现思路 分享一篇文章&#xff0c;让我们一同探索微信淘宝客自动查券找券返利机器人的工作原理与实现思路。结合微赚淘客系统&#xff0c;我们将为你揭开这个智能购物助手的神秘面纱。 一、引言 随着人工智能…