string类实现

目录

string类实现

1.构造函数(三种)

2.c_str()函数

3.operator[] 重载

4.size()函数实现

5.迭代器

6.reserve()函数实现

7.push_back()函数实现

8.append()函数实现

9.operator+=实现

10.insert() 实现

11.erase()函数实现

12.find()函数实现

13.swap()函数实现

14.substr()函数实现

15.运算符重载比大小

16.clear

17.流插入 流提取实现

18.析构函数

补充修改

1.push_back优化

2.append优化

3.insert函数另外一种方法


string类实现

我们采用声明和定义分离的方式

首先是.h文件

//
//  string.hpp
//  String
//
//  Created by 南毅 on 2024/5/8.
//#ifndef string_hpp
#define string_hpp#endif /* string_hpp */
#include <iostream>
using namespace std;
#include <assert.h>
#include <string.h>namespace nanyi{class String{private:char* _str;size_t _size;size_t _capacity;const static size_t npos;public:typedef char* iterator;typedef const char* const_iterator;//s构造函数、初始化列表//拷贝构造String(const char* str = "");String();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;iterator begin();iterator end();const_iterator begin() const;const_iterator end() 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();};istream& operator>> (istream& is, string& str);ostream& operator<< (ostream& os, const string& str);
}

1.构造函数(三种)

//构造函数
String::String(const char* str):_size(strlen(str))
{_capacity = _size;_str = new char[_size + 1];strcpy(_str, str);
}
//默认构造
String::String(){_str = new char[1]{'\0'};_size = _capacity = 0;
}//拷贝构造
String::String(const String& s)
{_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}

2.c_str()函数

因为C形式字符串是内置类型,所以使用cout打印时编译器会自动识别类型,相当于使用%s进行打印字符串,只需要返回字符串数组首字符地址即可

const char* String:: c_str() const {return _str;
}

3.operator[] 重载

可以以数组的形式,通过下标访问数据

char& String::operator[](size_t pos){assert(pos < _size);return _str[pos];
}
const char& String::operator[](size_t pos) const{assert(pos < _size);return _str[pos];
}

4.size()函数实现

size_t String::size() const
{return _size;
}

5.迭代器

String::iterator String::begin(){return _str;
}String::iterator String::end(){return _str + _size;
}String::const_iterator String::begin() const{return _str;
}
String::const_iterator String::end() const{return _str + _size;
}

6.reserve()函数实现

void String::reserve(size_t n){char* tmp = new char[n+1];strcpy(tmp, _str);delete [] _str;_str = tmp;_capacity = n;
}

7.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++;
}

8.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;
}

9.operator+=实现

//+=一个字符
String& String::operator+=(char ch){push_back(ch);return *this;
}
//+=一个字符串
String& String::operator+=(const char* str){append(str);return *this;
}

10.insert() 实现

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];end--;}_str[pos] = ch;_size++;
}
void 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) {_str[end] = _str[end-len];end--;}memcpy(_str + pos, str, len);_size += len;
}

11.erase()函数实现

void String::erase(size_t pos, size_t len){assert(pos <= _size);if (len >= _size - pos) {_str[pos] = '\0';_size = pos;}else{strcpy(_str + pos, _str + pos + len);_size -= len;}
}

12.find()函数实现

size_t String::find(char ch, size_t pos){for (size_t i = 0; 0 < _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;
}

13.swap()函数实现

void String::swap(String& s){std::swap(_str, s._str);std::swap(_size, s._size);std::swap(_capacity, s._capacity);
}

14.substr()函数实现

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[pos+i];}return sub;}}

15.运算符重载比大小

bool String::operator<(const String& s) const{return strcmp(_str, s._str) < 0;
}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 !(*this == s);}

16.clear

 void String::clear(){_str[0] = '\0';_size = 0;}

17.流插入 流提取实现

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

18.析构函数

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

补充修改

1.push_back优化

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

2.append优化

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

3.insert函数另外一种方法

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;while (end >= (int)pos){_str[end + 1] = _str[end];--end;}_str[pos] = ch;++_size;
}
void String::insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}int end = _size;while (end >= (int)pos){_str[end + len] = _str[end];--end;}memcpy(_str + pos, str, len);_size += len;
}

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

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

相关文章

Chrome 浏览器的常用命令包括

Chrome 浏览器的常用命令包括&#xff1a; 1. **新建标签页**&#xff1a;Ctrl T &#xff08;在 Windows/Linux 下&#xff09;&#xff0c;Command T &#xff08;在 macOS 下&#xff09;。 2. **关闭当前标签页**&#xff1a;Ctrl W &#xff08;在 Windows/Linux 下&…

Java面试八股之Collection和Collections的区别

Java中Collection和Collections的区别 Collection 是一个接口&#xff0c;位于 java.util 包中&#xff0c;它是 Java 集合框架的顶层接口之一&#xff0c;代表了一组对象的集合。Collection 接口定义了所有集合类型&#xff08;如 List、Set、Queue 等&#xff09;所共有的基…

LeetCode2352相等行列对

题目描述 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 解析 针对题目给出的数量级…

cubemx配置stm32f407VET6实现can通信

背景&#xff1a; 项目上需要把原先的TMC5160电机驱动器替换为购买的电机控制模块&#xff08;该模块采用canopen通信&#xff09; 移植canopen的前提是can通信正常&#xff0c;现在添加一下can通信&#xff08;先用标准帧&#xff0c;250K bit/S的波特率测试&#xff09; 原理…

个人学习计划

vue前端&#xff08;一周&#xff09; 05/14 - 05/19 Html、css复习、vue基础复习、axios复习 05/14 ElementUI学习 05/15 JWT集成验证码、token 05/16 vue-route多角色登录 05/17 增删查改、文件下载 05/18 Echart饼状图 05/19 &#x1f4cc; 附加学习&#xff1a; 父子传值三…

其它高阶数据结构②_图(概念+存储+遍历+最小生成树)

目录 1. 图的概念 2. 图的存储结构 2.1 邻接矩阵&#xff08;后面算法所用&#xff09; 2.2 邻接表 3. 图的遍历 3.1 BFS广度优先遍历 3.2 DFS深度优先遍历 4. 最小生成树 4.1 Kruskal算法 4.2 Prim算法 本篇完。 1. 图的概念 图是由顶点集合及顶点间的关系组成的一…

重磅!麒麟信安发布CentOS安全加固套件

CentOS Linux 7系统即将在6月30日停服&#xff0c;标志CentOS全部停止更新和维护。党政、金融、能源、通信、交通、公共服务等关键信息基础设施领域已经投运使用的CentOS系统将无法获取官方提供的漏洞修复补丁&#xff0c;此后&#xff0c;CentOS系统将面临巨大的安全风险与危害…

【运维项目经历|003】:Nginx集群化运维升级项目

目录 项目名称 项目背景 项目目标 项目成果 我的角色与职责 我主要完成的工作内容 本次项目涉及的技术 本次项目遇到的问题与解决方法 本次项目中可能被面试官问到的问题 问题1&#xff1a;为什么选择nginx-1.25.4版本&#xff0c;nginx官方最新版本是哪一个版本&…

河南广电与LiblibAI签署战略合作协议

5月15日&#xff0c;河南广电科技与LiblibAI战略签约仪式在郑州中原福塔新闻发布厅隆重举行。双方将本着“共商、共享、共建、共赢”原则&#xff0c;基于全面、可持续的战略合作伙伴关系&#xff0c;发挥各自优势&#xff0c;共同聚焦生成式AI领域&#xff0c;围绕内容创作、商…

CPU占用率过高排查

CPU占用率高是设备本身的一种现象&#xff0c;直观表现为display cpu-usage命令查询结果中整机CPU占用率“CPU usage”偏高&#xff0c;如超过70%。在网络运行中CPU高常常会导致其他业务异常&#xff0c;如BGP震荡、VRRP频繁切换、甚至设备无法登录。 通常&#xff0c;整机CPU占…

Java基础教程 - 7 面向对象-1

更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 更好的阅读体验&#xff1a;点这里 &#xff08; www.doubibiji.com &#xff09; 7 面向对象 面向对象&am…

无人售货奶柜:掘金新零售蓝海,

无人售货奶柜&#xff1a;掘金新零售蓝海&#xff0c; 在日新月异的商业浪潮中&#xff0c;无人奶柜犹如一股清新的创业飓风&#xff0c;正以不可阻挡之势吸引着众多创业者的目光。这股新兴力量以其独到之处和庞大的市场蓝海&#xff0c;预示着一场关于健康、便捷消费方式的深…

【C#】DateTime类型数组含有null?并排序

代码 internal class Program{static void Main(string[] args){List<DateTime?> dateTimes new List<DateTime?> { null,DateTime.MinValue,DateTime.MaxValue};var temp new List<DateTime?> { };dateTimes.Sort();//dateTimes.Reverse();foreach (va…

石碑之谜:滚动机关

描述 在蒙德和璃月的边界地带&#xff0c;有一个被遗忘的神庙&#xff0c;里面有一个奇怪的机关&#xff1a;滚动石碑。小熊必须操作这个112的长方体石碑&#xff0c;使其通过不同的地面环境&#xff0c;最终放置到神秘的符号“O”上&#xff0c;以解开通往宝藏的大门。 石碑…

Edwards爱德华PHM3000培训PPT课件内容可见图片详情

Edwards爱德华PHM3000培训PPT课件内容可见图片详情

golang encoding/json 使用基础

json 与 encoding/json JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于 ECMAScript&#xff08;欧洲计算机协会制定的js规范&#xff09;的一个子集&#xff0c;采用完全独立于语言的文本格式来存储和表示数据。简洁和…

SDL系列(一)—— 小白入门

SDL &#xff08; Simple DirectMedia Layer &#xff09; 是一套开放源代码的 跨平台多媒体开发库 &#xff0c;使用 C 语 言写成。 SDL 提供了数种控制图像、声音、输出入的函数&#xff0c;让开发者只要用相同或是相似的 代码就可以开发出 跨多个平台&#xff08; Linu…

618有什么划算的数码产品?4款精选数码好物清单分享,赶紧码住!

随着618购物节慢慢开始&#xff0c;数码产品的大门已经向你敞开&#xff0c;等你来发现里面的各种乐趣。在这个购物的好时节&#xff0c;我们为你准备了一些很不错的数码东西&#xff0c;不管是喜欢新鲜科技的你&#xff0c;还是需要实用小工具的朋友们&#xff0c;这里都有可能…

安卓、iOS、iPad三端搞定,不再剧荒!

哈喽&#xff0c;各位小伙伴们好&#xff0c;我是给大家带来各类黑科技与前沿资讯的小武。 之前给大家推荐过各种看剧姿势&#xff0c;但很多苹果、平板端的小伙伴还是存在更好的需求体验&#xff0c;今天给大家推荐这款可以在安卓、iOS和平板上都能安装使用&#xff0c;不再剧…

2024自学网络安全的三个必经阶段(含路线图)_网络安全自学路线

一、为什么选择网络安全&#xff1f; 这几年随着我国《国家网络空间安全战略》《网络安全法》《网络安全等级保护2.0》等一系列政策/法规/标准的持续落地&#xff0c;网络安全行业地位、薪资随之水涨船高。 未来3-5年&#xff0c;是安全行业的黄金发展期&#xff0c;提前踏入…