C++:模拟实现string类

文章目录

  • Iterator类
  • capacity类
  • Element access 类
  • Modifiers类
  • String operations类
  • 类外成员函数
  • 头文件总括

本篇主要介绍模拟实现string类,string中有相当多的内容,这里实现一些相对用途广泛的场景

先看要实现的内容有哪些:

在这里插入图片描述

上图源于cplusplus网站,从中截取了部分内容准备进行模拟实现

首先既然string是一个类,那么首先要把类的这个框架搭建起来,我们把string类这个对象放到命名空间中,这样就不会和std中的类所冲突,一个类起码要有构造函数析构函数成员变量:

namespace My_string
{class string{public:
// Constructor/Destructorstring(const char* str = ""): _size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];strcpy(_str, str);}~string(){delete[] _str;}string& operator=(const char* str){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);return *this;}string& operator=(const string& str){_capacity = str._capacity;_size = str._size;_str = new char[_capacity + 1];strcpy(_str, str._str);return *this;}string& operator=(char c){_capacity = 1;_size = 1;_str = new char[_capacity + 1];_str[0] = c;return *this;}private:char* _str;size_t _size;size_t _capacity;const static size_t npos;};const size_t string::npos = -1;
}

至此,string类的大体框架已经搭建完毕了,下面进行string类内部成员函数的完善

Iterator类

begin和end迭代器实现:

在这里插入图片描述
从上面库函数中可以看出,这里返回的是迭代器,而我们又知道,实际上迭代器就是指针的作用,因此我们这里就用指针来模拟实现迭代器的作用

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

capacity类

实现的函数主要有:
在这里插入图片描述

// Capacity
size_t size()
{return _size;
}
size_t size() const
{return _size;
}
size_t lenth()
{return _size;
}
void resize(size_t n, char c = '\0')
{;
}
size_t capacity()
{return _capacity;
}
void reserve(size_t n)
{if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}
}
void clear()
{memset(_str, '\0', _size);_size = 0;
}
bool empty() const
{if (_size == 0){return true;}return false;
}

Element access 类

实现的函数主要有

在这里插入图片描述

// Element access
char& operator[](size_t pos)
{assert(pos < _size);return _str[pos];
}
const char& operator[](size_t pos) const
{assert(pos < _size);return _str[pos];
}
char& at(size_t pos)
{assert(pos < _size);return _str[pos];
}
const char& at(size_t pos) const
{assert(pos < _size);return _str[pos];
}
char& back()
{return _str[_size - 1];
}
const char& back() const
{assert(_size - 1 >= 0);return _str[_size - 1];
}
char& front()
{assert(_size - 1 >= 0);return _str[0];
}
const char& front() const
{return _str[0];
}

Modifiers类

实现的函数主要有

在这里插入图片描述

//Modifiers
string operator+(const char* str)
{size_t len = strlen(str);reserve(len + _size);strcpy(_str + _size, str);string s1;s1 = *this;return s1;
}
string operator + (const string& str)
{size_t len = strlen(str._str);reserve(len + _size);strcpy(_str + _size, str._str);string s1;s1 = *this;return s1;
}
string operator + (char str)
{if (_size == _capacity){reserve(_size + 1);}_str[_size++] = str;string s1;s1 = *this;return s1;
}
string& operator+=(const char* str)
{append(str);return *this;
}
string& operator += (const string& str)
{append(str);return *this;
}
string& operator += (char str)
{push_back(str);return *this;
}
void append(const string& str)
{size_t len = strlen(str._str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str._str);_size += len;
}
void append(const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;
}
void push_back(char c)
{if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = c;_str[_size] = '\0';
}
string& insert(size_t pos, char ch)
{assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}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(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + len;while (end > pos + len - 1){_str[end] = _str[end - len];--end;}memmove(_str + pos, str, len);_size += len;
}
string& insert(size_t pos, const string& str)
{assert(pos <= _size);size_t len = strlen(str._str);if (_size + len == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + len;while (end > pos + len - 1){_str[end] = _str[end - len];--end;}memmove(_str + pos, str._str, len);_size += len;
}
string& erase(size_t pos, size_t  len = npos)
{if (len == -1){size_t n = pos;while (n < _size){_str[n] = '\0';n++;}_size = pos - 1;}else{assert(pos + len < _size);size_t left = pos + len - 1;size_t end = _size + 1;while (left < end){_str[pos] = _str[left];pos++;left++;}_size = _size - len;}return *this;
}
void swap(string& s)
{string tmp = s;s = *this;*this = tmp;
}
void pop_back()
{_str[_size - 1] = '\0';_size--;
}

String operations类

实现的函数主要有:

在这里插入图片描述

char* c_str()
{return _str;
}
size_t find(const string& str, size_t pos = 0) const
{int begin = 0;int end = (int)_size;while (begin < end){size_t len = strlen(str._str);if (_str[begin] == str._str[0]){int left = begin;int res = 1;for (int i = 0; i < len; i++){if (_str[left] != _str[i]){break;}res++;left++;}if (res == len){return begin;}}else{begin++;}}return npos;
}
string substr(size_t pos = 0, size_t len = npos) const
{string s1;if (len == npos){while (_str[pos] != '\0'){s1 += _str[pos];pos++;}}else{for (int i = 0; i < len; i++){s1 += _str[pos];pos++;}}return s1;
}string operator+ (const string& str) const
{return *this + str;
}bool operator== (const string& str) const
{return strcmp(_str, str._str) == 0;
}
bool operator!= (const string& str) const
{return !(*this == str);
}
bool operator< (const string& str) const
{return strcmp(_str, str._str) < 0;
}
bool operator> (const string& str) const
{return strcmp(_str, str._str) > 0;
}
bool operator<= (const string& str) const
{return (*this < str) || (*this == str);
}
bool operator>= (const string& str) const
{return (*this > str) || (*this == str);
}

类外成员函数

实现的函数主要有:

在这里插入图片描述

std::ostream& operator<<(std::ostream& out, const string& s)
{for (size_t i = 0; i < s.size(); i++){out << s[i];}return out;
}std::istream& operator>>(std::istream& in, string& s)
{s.clear();char ch;ch = in.get();s.reserve(128);while (ch != ' ' && ch != '\n'){s += ch;ch = in.get();}return in;
}

头文件总括

#include <iostream>
#include <assert.h>namespace My_string
{typedef char* iterator;typedef const char* const_iterator;class string{public:// Constructor/Destructorstring(const char* str = ""): _size(strlen(str)), _capacity(_size){_str = new char[_capacity + 1];strcpy(_str, str);}~string(){delete[] _str;}string& operator=(const char* str){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);return *this;}string& operator=(const string& str){_capacity = str._capacity;_size = str._size;_str = new char[_capacity + 1];strcpy(_str, str._str);return *this;}string& operator=(char c){_capacity = 1;_size = 1;_str = new char[_capacity + 1];_str[0] = c;return *this;}// Iteratoriterator begin(){return _str;}const_iterator begin() const{return _str;}iterator end(){return _str + _size;}const_iterator end() const{return _str + _size;}// Capacitysize_t size(){return _size;}size_t size() const{return _size;}size_t lenth(){return _size;}void resize(size_t n, char c = '\0'){;}size_t capacity(){return _capacity;}void reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}void clear(){memset(_str, '\0', _size);_size = 0;}bool empty() const{if (_size == 0){return true;}return false;}// Element accesschar& operator[](size_t pos){assert(pos < _size);return _str[pos];}const char& operator[](size_t pos) const{assert(pos < _size);return _str[pos];}char& at(size_t pos){assert(pos < _size);return _str[pos];}const char& at(size_t pos) const{assert(pos < _size);return _str[pos];}char& back(){return _str[_size - 1];}const char& back() const{assert(_size - 1 >= 0);return _str[_size - 1];}char& front(){assert(_size - 1 >= 0);return _str[0];}const char& front() const{return _str[0];}//Modifiersstring operator+(const char* str){size_t len = strlen(str);reserve(len + _size);strcpy(_str + _size, str);string s1;s1 = *this;return s1;}string operator + (const string& str){size_t len = strlen(str._str);reserve(len + _size);strcpy(_str + _size, str._str);string s1;s1 = *this;return s1;}string operator + (char str){if (_size == _capacity){reserve(_size + 1);}_str[_size++] = str;string s1;s1 = *this;return s1;}string& operator+=(const char* str){append(str);return *this;}string& operator += (const string& str){append(str);return *this;}string& operator += (char str){push_back(str);return *this;}void append(const string& str){size_t len = strlen(str._str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str._str);_size += len;}void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}strcpy(_str + _size, str);_size += len;}void push_back(char c){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size++] = c;_str[_size] = '\0';}string& insert(size_t pos, char ch){assert(pos <= _size);if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}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(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + len;while (end > pos + len - 1){_str[end] = _str[end - len];--end;}memmove(_str + pos, str, len);_size += len;}string& insert(size_t pos, const string& str){assert(pos <= _size);size_t len = strlen(str._str);if (_size + len == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}size_t end = _size + len;while (end > pos + len - 1){_str[end] = _str[end - len];--end;}memmove(_str + pos, str._str, len);_size += len;}string& erase(size_t pos, size_t  len = npos){if (len == -1){size_t n = pos;while (n < _size){_str[n] = '\0';n++;}_size = pos - 1;}else{assert(pos + len < _size);size_t left = pos + len - 1;size_t end = _size + 1;while (left < end){_str[pos] = _str[left];pos++;left++;}_size = _size - len;}return *this;}void swap(string& s){string tmp = s;s = *this;*this = tmp;}void pop_back(){_str[_size - 1] = '\0';_size--;}// String operationschar* c_str(){return _str;}size_t find(const string& str, size_t pos = 0) const{int begin = 0;int end = (int)_size;while (begin < end){size_t len = strlen(str._str);if (_str[begin] == str._str[0]){int left = begin;int res = 1;for (int i = 0; i < len; i++){if (_str[left] != _str[i]){break;}res++;left++;}if (res == len){return begin;}}else{begin++;}}return npos;}string substr(size_t pos = 0, size_t len = npos) const{string s1;if (len == npos){while (_str[pos] != '\0'){s1 += _str[pos];pos++;}}else{for (int i = 0; i < len; i++){s1 += _str[pos];pos++;}}return s1;}string operator+ (const string& str) const{return *this + str;}bool operator== (const string& str) const{return strcmp(_str, str._str) == 0;}bool operator!= (const string& str) const{return !(*this == str);}bool operator< (const string& str) const{return strcmp(_str, str._str) < 0;}bool operator> (const string& str) const{return strcmp(_str, str._str) > 0;}bool operator<= (const string& str) const{return (*this < str) || (*this == str);}bool operator>= (const string& str) const{return (*this > str) || (*this == str);}private:char* _str;size_t _size;size_t _capacity;const static size_t npos;};const size_t string::npos = -1;std::ostream& operator<<(std::ostream& out, const string& s){for (size_t i = 0; i < s.size(); i++){out << s[i];}return out;}std::istream& operator>>(std::istream& in, string& s){s.clear();char ch;ch = in.get();s.reserve(128);while (ch != ' ' && ch != '\n'){s += ch;ch = in.get();}return in;}
}

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

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

相关文章

上海亚商投顾:沪指震荡微涨 金融、地产午后大幅走强

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 三大指数早盘震荡&#xff0c;午后集体拉升反弹&#xff0c;创业板指涨超1%。券商等大金融板块午后再度走强&#…

触发器实现海豚调度失败企业微信自动告警

原理 触发器监控工作流实例表&#xff0c;当工作流实例表中的状态更新后&#xff0c;针对状态为失败的任务进行企业微信告警。 发送企业微信消息函数 su - postgres # 必须在pg的主机上线安装requests模块 pip install requests # 以postgres用户登陆psql客户端到etl数据库 …

HDFS中的NAMENODE元数据管理(超详细)

元数据管理 元数据是什么元数据管理概述内存元数据元数据文件fsimage内存镜像文件edits log编辑日志 namenode加载元数据文件顺序 元数据管理相关目录文件元数据相关文件VERSIONseen_txid 元数据文件查看&#xff08;OIV,OEV&#xff09;SecondaryNameNode介绍checkpoint机制SN…

vue中显示在页面顶部的进度条插件——NProgress

我们在一些网站中经常见到导航栏上方的进度条显示&#xff0c;大家仔细观察&#xff0c;其实csnd中也有类似的效果&#xff0c;如下图显示效果&#xff0c;我们现在就来一起看看这个功能需求是怎么实现的。 一、功能需求 首先&#xff0c;实现这个功能其实不难&#xff0c;说实…

python 接入GoogleAuth

经常会用到GoogleAuth作为二次验证码&#xff0c;就扒了代码看看这块逻辑如何实现的&#xff0c;做个笔记。 import hmac import struct import time from hashlib import sha1 from urllib.parse import urlencode, quoteif __name__ __main__:# account会作为标识显示在身份…

yolo-v5学习(使用yolo-v5进行安全帽检测错误记录)

常见错误 跑YOLOv5遇到的问题_runtimeerror: a view of a leaf variable that requi_Pysonmi的博客-CSDN博客 python train.py --img 640 --batch 16 --epochs 10 --data ./data/custom_data.yaml --cfg ./models/custom_yolov5.yaml --weights ./weights/yolov5s.pt 1、梯度…

elementui Cascader 级联选择使用心得

相信大家对于elementui并不陌生&#xff0c;作为适配Vue的优秀UI框架之一&#xff0c;一直被所有的开发者痛并快乐着。今天要记录的就是里边的主角之一Cascader。 首先先介绍一下Cascader ---> 当一个数据集合有清晰的层级结构时&#xff0c;可通过级联选择器逐级查看并选择…

解密Redis:应对面试中的缓存相关问题2

面试官&#xff1a;Redis集群有哪些方案&#xff0c;知道嘛&#xff1f; 候选人&#xff1a;嗯~~&#xff0c;在Redis中提供的集群方案总共有三种&#xff1a;主从复制、哨兵模式、Redis分片集群。 面试官&#xff1a;那你来介绍一下主从同步。 候选人&#xff1a;嗯&#xff…

检测文本是否由AI生成,GPT、文心一言等均能被检测

背景 目前很多机构推出了ChatGPT等AI文本检测工具&#xff0c;但是准确率主打一个模棱两可&#xff0c;基本和抛硬币没啥区别。 先说结论&#xff0c;我们对比了常见的几款AI检测工具&#xff0c;copyleaks检测相比较而言最准确。 检测文本 AI文本片段1 来源&#xff1a;G…

Windows上安装 jdk 环境并配置环境变量 (超详细教程)

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01; &#x1f40b; 希望大家多多支…

Spring IOC

◆ 传统Javaweb开发的困惑 ◆ IoC、DI和AOP思想提出 ◆ Spring框架的诞生 Spring | Home IOC控制反转&#xff1a;BeanFactory 快速入门 package com.xiaolin.service.Impl;import com.xiaolin.dao.UserDao; import com.xiaolin.service.UserService;public class UserServic…

vue2-diff算法

1、diff算法是什么&#xff1f; diff算法是一种通过同层的树节点进行比较的高效算法。 其有两个特点&#xff1a; 比较只会在同层级进行&#xff0c;不会跨层级进行。 在diff比较的过程中&#xff0c;循环从两边向中间比较。 diff算法在很多场景中都有应用&#xff0c;在vue中&…