c++中string的模拟实现(超详细!!!)

1.string的成员变量、(拷贝)构造、析构函数

1.1.成员变量

private:char* _str;size_t _size; //string中有效字符个数size_t _capacity; //string中能存储有效字符个数的大小

1.2(拷贝)构造函数

//构造函数string(const char* str = ""){//结尾处的'\0'不算做有效字符,//所以在底层的空间上要多开一个字节的空间来存放'\0'_size = strlen(str);_str = new char[_size + 1];//_capacity是能存储有效字符的大小,不包括'\0'_capacity = _size;strcpy(_str,str);}
//拷贝构造string(const string& s){_str = new char[s._capacity+1];strcpy(_str,s._str);_size = s._size;_capacity = s._capacity;}

1.3析构函数

//析构函数~string(){delete[] _str;_str = nullptr;_capacity = _size = 0;}

1.4赋值拷贝

//赋值拷贝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;}

2.string的遍历

2.1下标遍历

//下标遍历char& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}

2.2迭代器遍历

范围for底层逻辑其实就是套用的迭代器,故我们不考虑范围for

//迭代器遍历typedef char* iterator;iterator begin(){return _str;}iterator end(){return _str+_size;}//迭代器指向的内容不能变typedef const char* const_iterator;const_iterator begin()const{return _str;}const_iterator end()const{return _str + _size;}

3.string的增删查改

3.1尾插

//扩容void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}//尾插void push_back(char ch){//判断是否扩容if (_size = _capacity){//需要注意capacity是否为0size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;reserve(newcapacity);}_str[_size] = ch;_str[++_size] = '\0';}void append(const char* str){//判断是否扩容size_t len = strlen(str);if (_size + len > _capacity){reserve(_size+len);}strcpy(_str + _size, str);_size += len;}string& operator+=(char ch){push_back(ch);return *this;}string& operator+=(const char* str){append(str);return *this;}

3.2中间插入(头插)

//中间插入(头插)string& insert(size_t pos, char c){//判断是否越界assert(pos <= _size);//判断是否扩容if (_size = _capacity){//需要注意capacity是否为0size_t newcapacity = _capacity == 0 ? 4 : 2 * _capacity;reserve(newcapacity);}for (size_t end = _size + 1; end > pos; end--){_str[end] = _str[end - 1];}_str[pos] = c;++_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);}//调整空间for (size_t end = _size + len; end > pos; end--){_str[end] = _str[end - len];}	strncpy(_str + pos, str , len);_size += len;return *this;}

3.3删除字符

//删除pos位置上的元素string& erase(size_t pos, size_t len = npos){assert(pos < _size);//pos以后的全部删除的情况if (len == npos || _size - pos <= len ){_str[pos] = '\0';_size = pos;}//删除部分的情况else{size_t end = pos + len;strcpy(_str + pos, _str + end);_size = end;}return *this;}

3.4查找字符/字符串

//查找字符// 返回c在string中第一次出现的位置size_t find(char c, size_t pos = 0) const{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == 'c'){return i;}}}// 返回子串s在string中第一次出现的位置size_t find(const char* str, size_t pos = 0) const{const char * ptr = strstr(_str+pos, str);if (ptr == nullptr){return npos;}else{return ptr - _str;}}

返回len长度的子串

string substr(size_t pos = 0, size_t len = npos)

//返回len长度的子串string substr(size_t pos = 0, size_t len = npos){assert(pos < _size);size_t end = pos + len;//取完的情况if (len == npos || _size - pos <= len){end = _size;}string s;s.reserve(end - pos);for (size_t i = pos; i < end; i++){s += _str[i];}return s;}

4.string的cout\cin

//cout\cin的重载ostream& operator<<(ostream& out, const string& s){for (auto ch : s){out << ch;}return out;}istream& operator>>(istream& in, string& s){//清空字符串ss.clear();char ch = in.get();char buff[128];int 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;}

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

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

相关文章

【Linux进阶之路】HTTP协议

文章目录 一、基本概念1.HTTP2.域名3.默认端口号4.URL 二、请求与响应1.抓包工具2.基本框架3.简易实现3.1 HttpServer3.2 HttpRequest3.2.1 version13.2.2 version23.2.3 version3 总结尾序 一、基本概念 常见的应用层协议&#xff1a; HTTPS (HyperText Transfer Protocol Sec…

C# 8.0+版本项目 string不可为空

1.在某一次新建项目的时候发现&#xff0c;新建的项目&#xff0c;写的测试接口&#xff0c;接口的入参有string的参数&#xff0c; 但是调用接口的时候string的参数没有传报了400&#xff0c;很奇怪&#xff0c;也没有语法错误之类的。 2.解决办法 在项目上右键->属性->…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Span)

作为Text组件的子组件&#xff0c;用于显示行内文本的组件。 说明&#xff1a; 该组件从API Version 7开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 该组件从API Version 10开始支持继承父组件Text的属性&#xff0c;即如果子组件未设置…

直播美颜SDK的商业化应用:如何为直播平台带来更多商业机会?

直播过程中的自然环境和摄像头本身的限制可能会影响用户的体验&#xff0c;因此直播美颜SDK的商业化应用应运而生&#xff0c;它为直播平台带来了更多商业机会。 直播美颜SDK是一种集成在直播平台中的软件开发工具包&#xff0c;它能够对直播过程中的视频流进行实时的美颜处理…

【C++ Primer Plus学习记录】简单文件输入/输出

有时候&#xff0c;通过键盘输入并非最好的选择。例如&#xff0c;假设您编写了一个股票分析程序&#xff0c;并下载了一个文件&#xff0c;其中包含1000种股票的价格。在这种情况下&#xff0c;让程序直接读取文件&#xff0c;而不是手工输入文件中所有的值&#xff0c;将方便…

惬意了解 —— 前端发展史

下拉底部&#xff0c;参与投票&#xff5e;&#xff5e; 前端发展史&#xff1a;从洪荒时代到现代 前端开发已经走过了将近20年的历程&#xff0c;从最早的纯静态页面到如今的现代前端框架&#xff0c;我们见证了前端技术的蓬勃发展。让我们一起回顾这段历史。 洪荒时代&…

深入联合文件系统

Union File System&#xff08;联合文件系统&#xff0c;UnionFS&#xff09;是一种轻量级的高性能分层文件系统&#xff0c;它支持将文件系统中的修改信息作为一次提交&#xff0c;并层层叠加&#xff0c;同时可以将不同目录挂载到同一个虚拟文件系统下&#xff0c;应用看到的…

2024年A特种设备相关管理(锅炉压力容器压力管道)证考试题库及A特种设备相关管理(锅炉压力容器压力管道)试题解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;证考试题库及A特种设备相关管理&#xff08;锅炉压力容器压力管道&#xff09;试题解析是安全生产模拟考试一点通结合&#xff08;安监局&#…

不同的二叉搜索树 01背包

96.不同的二叉搜索树 力扣题目链接(opens new window) 给定一个整数 n&#xff0c;求以 1 ... n 为节点组成的二叉搜索树有多少种&#xff1f; dp[3] dp[2] * dp[0] dp[1] * dp[1] dp[0] * dp[2] dp[i] &#xff1a; 1到i为节点组成的二叉搜索树的个数为dp[i]。 dp[i] d…

Vivado2021及以下版本 HLS生成IP核报错的解决方案

摘要&#xff1a;生成 HLS ip的时候会报错&#xff0c;无法生成&#xff1b;原因是2021及以下的版本都会有时间错误的问题&#xff0c;所以要用官方的补丁包&#xff0c;但是打了补丁包有时候也会没用 一、打补丁 以下是xilinx提供的解决办法&#xff1a; Export IP Invalid …

振弦采集仪在岩土工程施工质量监控中的应用案例分析

振弦采集仪在岩土工程施工质量监控中的应用案例分析 河北稳控科技振弦采集仪是一种用来监测振动的仪器设备&#xff0c;可以通过采集振弦信号来分析结构的振动特性。在岩土工程施工质量监控中&#xff0c;振弦采集仪可以用于以下几个方面的应用。 1. 地基与基础工程监测&#…

11.Java---语法总结之一个小项目

图书管理系统 Java学习了很久了,今天将运用之前学习的所有东西整理做个小小的小项目. 1.首先是各种包和操作方法建好 2.然后是项目的大框架搭好 3.然后就开始实现各个部分了 看看最后的运行结果吧! 管理员测试 1.登录&显示图书的运行结果 2.查找&新增图书的运行结…

【黑马程序员】python函数

文章目录 函数什么是函数为什么学习函数函数定义函数的传入参数函数的返回值返回值基础None返回值 函数说明文档函数的嵌套调用定义代码示例 全局变量和局部变量全局变量global变量局部变量 函数综合案例 函数 什么是函数 组织好的&#xff0c;可重复使用的、用来实现特定功能…

图像分割损失函数

为什么要乘以2&#xff0c;是为了让DICE的值域在0和1之间 优化&#xff1a;两种LOSS相加 Focus loss:

【PLSQL】plsqldeveloper查询结果记录显示不全

plsql版本号为12或13。 例如scott用户的emp表中共有14条数据&#xff0c;但select * from emp;查询结构只显示13条记录&#xff0c;如下&#xff1a; 这是由于查询结果显示条数&#xff0c;根据查询框高度自动计算可以显示多少条记录&#xff0c;如果想显示全&#xff0c;则需…

阿里云领盲盒活动

阿里云每次的活动都很给力&#xff0c;实打实地发东西。 这次是体验 通义灵码 的活动&#xff0c;这个是体验的推广链接 「通义灵码 体验 AI 编码&#xff0c;开 AI 盲盒」 我是在vscode安装的&#xff0c;体验还行&#xff0c;抽奖抽到了马克杯 这个是抽奖的具体步骤 https:…

程序猿成长之路之socket篇-socket通信原理简介

hello,各位小伙伴们大家好&#xff0c;上次以RSA加解密算法介绍作为密码学篇的结尾后&#xff0c;时光飞逝&#xff0c;转眼到了新一年的春季&#xff0c;这次将介绍一下socket通信和编程原理。 什么是socket&#xff08;套接字&#xff09;&#xff1f; socket&#xff08;套…

Matlab|【分布鲁棒】数据驱动的多离散场景电热综合能源系统分布鲁棒优化算法

目录 主要内容 1.1 主要难点-分布鲁棒优化 1.2 程序求解步骤-主子问题迭代 部分结果 下载链接 主要内容 本程序主要对《基于场景聚类的主动配电网分布鲁棒综合优化》-高海淑的方法复现&#xff0c;应用到综合能源电热微网方向&#xff0c;采用拉丁超立方抽样对不同…

[计算机效率] 在当前文件夹以管理员身份运行批处理

2.7 在当前文件夹以管理员身份运行批处理 这个功能对于要经常运行批处理程序的人来说真的很方便。每次要要运行批处理&#xff0c;要么就是直接打开的批处理不是以管理员身份运行的&#xff0c;要么就是在批处理中要一步步的切换进入到目标文件夹中&#xff0c;非常费时间。 方…

录屏直播技巧大揭秘,轻松捕捉精彩瞬间

录屏直播作为一种流行的线上内容创作方式&#xff0c;备受关注。无论是游戏主播、教程讲解还是线上会议&#xff0c;录屏直播都能轻松应对。本文将介绍三种录屏直播方法&#xff0c;并对其进行分步骤详细说明&#xff0c;帮助读者轻松掌握录屏直播的技巧&#xff0c;为内容创作…