实现一个超级简单的string类(基于c++)

        简单的string仅仅需要构造函数,拷贝构造,移动构造和移动赋值,operator=,析构函数等。如下:

#include<iostream>
#include<assert.h>
using namespace std;
namespace qyy
{class string{public:friend 	ostream& operator<<(ostream& out, const string& s);friend istream& operator>>(istream& in, const string& s);template <class T>void swap(T &t1, T& t2)//方便交换{T tmp = t1;t1 = t2;t2 = tmp;}typedef char*  iterator;//迭代器是原生的指针iterator begin(){return _str;}iterator end(){return _str + _size;}//构造函数string(const char*str = ""):_size(strlen(str))	{_str = new char[strlen(str) + 1];strcpy(_str, str);_capacity = _size ;}//拷贝构造--左值引用版本string(const string& s1){string s(s1._str);_str = nullptr;swap(_str,s._str);swap(_size, s._size);swap(_capacity, s._capacity);}//operator=--左值引用版本string& operator= ( string s){if (this != &s)//防止自己给自己赋值{delete []_str;_str = nullptr;swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}return *this;}//右值引用版本的拷贝构造和operator=//移动构造string(string && s):_str(nullptr),_capacity(0),_size(0){swap(_str,s._str);swap(_size, s._size);swap(_capacity, s._capacity);}//移动赋值string& operator=(string&& s){if (this != &s){swap(_str, s._str);swap(_size, s._size);swap(_capacity, s._capacity);}return *this;}//operator[]char& operator[](size_t i){assert(_str);assert(i < _size);return *(_str + i);}~string(){delete[] _str;_str = nullptr;_size = _capacity = -1;}void reserve(size_t size)//增大空间{if (size > _capacity){char* tmp = new char[size + 1];//开新空间//拷贝数据strcpy(tmp, _str);//释放旧空间if(_str)//确保指针不为空delete[]_str;_str = tmp;_capacity = size;}}void resize(size_t size,const char ch = '/0')//开空间{//改变容量if (size < _size){//直接将_size改变就行_str[size] = '/0';_size = size;}else{if (size > _capacity)//增容reserve(size);//给新开辟的空间填充chwhile (_size < size){_str[_size++] = ch;}_str[_size] = '/0';//在末尾补充'/0'}}void push_back(char ch){if (_size == _capacity)//需要增容{size_t newcapacity = _capacity == 0 ? 10 : _capacity * 2;reserve(newcapacity);}_str[_size++] = ch;//尾插字符_str[_size] = '/0';}//operator+=string&operator+=(char ch){push_back(ch);return *this;}const char* c_str()const{return this->_str;}private:char* _str;size_t _size;size_t _capacity;//不包含最后的/0};ostream& operator<<(ostream&out,const string &s){out << s._str;return out;}istream& operator>>(istream& in, const string& s){in >> s._str;return in;}
}

        测试代码用于测试string类:

#include"string.h"
int main()
{qyy::string s1;qyy::string s2("hhhh");s2 = s1;qyy::string s3(s2);return 0;
}

        

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

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

相关文章

Spark

Apache Spark是一种快速、通用、可扩展的大数据处理引擎&#xff0c;旨在处理大规模数据集并进行高效的数据分析。与Hadoop MapReduce相比&#xff0c;Spark具有更高的性能和更丰富的功能&#xff0c;可以处理更复杂的数据处理任务。以下是Apache Spark的一些基本概念&#xff…

idea2023+springboot 热部署配置

pom 中配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional></dependency>idea

蓝桥杯每日一题2023.9.21

蓝桥杯2021年第十二届省赛真题-异或数列 - C语言网 (dotcpp.com) 题目描述 Alice 和 Bob 正在玩一个异或数列的游戏。初始时&#xff0c;Alice 和 Bob 分别有一个整数 a 和 b&#xff0c;有一个给定的长度为 n 的公共数列 X1, X2, , Xn。 Alice 和 Bob 轮流操作&#xff0…

Rsync学习笔记2

Rsync&#xff1a; 增量操作&#xff1a; 1&#xff09; server01服务文件变动。 [rootserver03 tp5shop]# rsync -av /usr/local/nginx/html/tp5shop root192.168.17.109:/usr/local/nginx/html/ sending incremental file listsent 88,134 bytes received 496 bytes 177,…

js/axios/umi-request 根据后端返回的二进制流下载文件

type ResponseType {data: Blob;headers: {content-disposition?: string;}; }; // 下载 (创建a标签) export const downloadBlob (response: ResponseType) > {const blob response.data; // 获取响应中的 Blob 数据const contentDisposition response.headers[conten…

如何评估测试用例的优先级?

评估测试用例的优先级&#xff0c;有助于我们及早发现和解决可能对系统稳定性和功能完整性产生重大影响的问题&#xff0c;助于提高测试质量&#xff0c;提高用户满意度。 如果没有做好测试用例的优先级评估&#xff0c;往往容易造成对系统关键功能和高风险场景测试的忽略&…

黑马JVM总结(十八)

&#xff08;1&#xff09;G1_FullGC的概念辨析 SerialGC&#xff1a;串行的&#xff0c;ParallelGC&#xff1a;并行的 &#xff0c;CMS和G1都是并发的 这几种垃圾回收器的新生代回收机制时相同的&#xff0c;SerialGC和ParalledGC&#xff1a;老年代内存不足触发的叫FullGC…

zabbix自定义监控、钉钉、邮箱报警 (五十六)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 一、实验准备 二、安装 三、添加监控对象 四、添加自定义监控项 五、监控mariadb 1、添加模版查看要求 2、安装mariadb、创建用户 3、创建用户文件 4、修改监控模版 5、…

Vue2的学习

computed计算属性 概念 基于现有数据&#xff0c;计算出来的新属性&#xff0c;依赖的数据变化&#xff0c;会自动重新计算 语法 声明在computed配置项中&#xff0c;一个计算属性对应一个函数这是一个属性{{计算属性名}}&#xff0c;不是方法注意不要忘记return <body…

uniapp开发h5,解决项目启动时,Network: unavailable问题

网上搜了很多&#xff0c;发现都说是要禁用掉电脑多余的网卡&#xff0c;这方法我试了没有好&#xff0c;不晓得为啥子&#xff0c;之后在网上看&#xff0c;uniapp的devServer vue2的话对标的就是webpack4的devserver&#xff08;除了复杂的函数配置项&#xff09;&#xff0c…

C语言学习:14、递归函数

所谓递归&#xff0c;就是函数自己调用自己 递归就是将大问题分解成小问题&#xff0c;分而治之&#xff1b; 递归分解的是有限的问题&#xff0c;无限的问题就不能递归了,会导致程序崩溃。 //数列求和 //Sn a1 a1 ... an //Sn Sn-1 an, S1 a1 程序示例1&#xff1a;求…

持有NPDP证书是否可以进入高薪行业?

对于NPDP&#xff0c;一部分人考完PMP&#xff0c;想要继续提升自己的职场竞争力&#xff0c;一部分人是想直接考NPDP&#xff0c;但不确定它是否真的可以帮助到自己的职业发展&#xff0c;还处于一个犹豫踌躇的状态&#xff0c;那么我就来详细的介绍下NPDP考试的相关讯息&…

HTML5+CSS3+JS小实例:鼠标控制飞机的飞行方向

实例:鼠标控制飞机的飞行方向 技术栈:HTML+CSS+JS 效果: 源码: 【html】 <!DOCTYPE html> <html><head><meta http-equiv="content-type" content="text/html; charset=utf-8"><meta name="viewport" conten…

9.17 校招 实习 内推 面经

绿泡*泡&#xff1a; neituijunsir 交流裙 &#xff0c;内推/实习/校招汇总表格 1、自动驾驶一周资讯 - 一汽与Mobileye 签署战略合作&#xff0c;小鹏汽车将用经销商销售逐渐替换直营模式&#xff0c;原小鹏汽车副总裁加盟赛力斯 自动驾驶一周资讯 - 一汽与Mobileye 签署战…

【unity】关于技能释放shader.CreateGPUProgram造成卡顿,优化和定位方法。

关于优化方法&#xff0c;UWA这边有介绍 Unity移动端游戏性能优化简谱之 CPU耗时调优|单帧|动画|调用|unity|实例化_网易订阅 对此&#xff0c;我们可以将Shader通过ShaderVariantCollection收集要用到的变体并进行AssetBundle打包。在将该ShaderVariantCollection资源加载进内…

KubeSphere 在互联网医疗行业的应用实践

作者&#xff1a;宇轩辞白&#xff0c;运维研发工程师&#xff0c;目前专注于云原生、Kubernetes、容器、Linux、运维自动化等领域。 前言 2020 年我国互联网医疗企业迎来了“爆发元年”&#xff0c;越来越多居民在家隔离期间不方便去医院看诊&#xff0c;只好采取在线诊疗的手…

RK3568驱动指南|第五期-中断-

瑞芯微RK3568芯片是一款定位中高端的通用型SOC&#xff0c;采用22nm制程工艺&#xff0c;搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码&#xff0c;支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU&#xff0c;可用于轻量级人工…

瑞芯微:基于RK3568的ocr识别

光学字符识别&#xff08;Optical Character Recognition, OCR&#xff09;是指对文本资料的图像文件进行分析识别处理&#xff0c;获取文字及版面信息的过程。亦即将图像中的文字进行识别&#xff0c;并以文本的形式返回。OCR的应用场景 卡片证件识别类&#xff1a;大陆、港澳…

如何通过AI视频智能分析技术,构建着装规范检测/工装穿戴检测系统?

众所周知&#xff0c;规范着装在很多场景中起着重要的作用。违规着装极易增加安全隐患&#xff0c;并且引发安全事故和质量问题&#xff0c;例如&#xff0c;在化工工厂中&#xff0c;倘若员工没有穿戴符合要求的特殊防护服和安全鞋&#xff0c;将有极大可能受到有害物质的侵害…

前端代码静态检测工具汇总

前端静态代码检测工具是用于分析代码并在不运行的情况下找出其中的问题的工具。下面列出了一些常见的前端静态代码检测工具&#xff1a; 1. **ESLint**: ESLint 是一个开源的 JavaScript 代码检查工具&#xff0c;它被设计成完全可配置的&#xff0c;支持现代 JavaScript 和 JS…