当前位置: 首页 > news >正文

C++String模拟实现

实际上string没什么可讲,主要是对string函数的运用与理解,与其写库函数如何用,不如直接去看c++库函数来得好。

以下是自己实现string功能函数。但没对string库中的全部函数进行实现,而是实现主要使用的。

.cpp内是用来测试函数功能是否正确。

.h内是用来实现string

.CPP

#include"String.h"int main()
{moxuan::string s1;cout << s1.c_str() << endl;moxuan::string s2("abcd");cout << s2.c_str() << endl;//s1 = s2;cout << s1.c_str() << endl;cout << s2.c_str() << endl;s2.push_back('a');s2.append("11223344");cout << s2.c_str() << endl;//s1.push_back('a');s1.append("aabbccdd");cout << s1.c_str() << endl;s1.resize(10, 'a');cout << s1.c_str() << endl;s2.resize(20, 'v');cout << s2.c_str() << endl;s1 += 'a';s1.push_back('a');cout << s1.c_str() << endl;s2 += "99887766";cout << s2.c_str() << endl;moxuan::string::iterator it = s2.begin();while(it!=s2.end()){cout << *it;*it++;}cout << endl;moxuan::string::const_iterator cit = s2.begin();while (cit != s2.end()){cout << *cit;*cit++;}cout << endl;s2.inster(100, 'a');for (auto ch:s2){cout << ch;}cout << endl;s2.inster(0, 'p');s2.inster(24, 'G');for (auto ch : s2){cout << ch;}cout << endl;s2.inster(100, "ooooooo");s2.inster(0, "kkkkkk");s2.inster(12, "yyyyyyy");for (auto ch : s2){cout << ch;}cout << endl;s2.erase(0, 5);for (auto ch : s2){cout << ch;}cout << endl;cout << s2 << endl;moxuan::string s3;cin >> s3;cout << s3;return 0;
}

.h

#define CRT_SECURE_NO_WARNINGS
#pragma once
#include<iostream>
#include<string>
#include<assert.h>
using namespace std;namespace moxuan
{class string{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;}//s("abc")string(const char* s = ""):_size(strlen(s)), _capacity(_size){_str = new char[_capacity + 1];strcpy(_str, s);}//s(s1)string(const string& s):_size(s._size), _capacity(s._capacity){_str = new char[_capacity + 1];strcpy(_str, s._str);}//s=s1string& operator=(const string& s){if (this != &s){_size = s._size;_capacity = s._capacity;char* tmp = new char[_capacity + 1];delete[]_str;strcpy(tmp, s._str);_str = tmp;}return *this;}~string(){if (_str){delete[]_str;_str = nullptr;_size = _capacity = 0;}}const char* c_str() const{return _str;}char& operator[](size_t n){assert(n <= _capacity);return _str[n];}size_t size()const{return _size;}size_t capacity()const{return _capacity;}string& operator+=(const char ch){push_back(ch);return *this;}string& operator+=(const char* s){append(s);return *this;}//扩容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(const char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2 + 1);}_str[_size] = ch;_str[++_size] = '\0';}void append(const char* s){size_t len = _size + strlen(s);if (len > _capacity){reserve(len);}strcpy(_str+_size, s);_size = len;}void resize(size_t  n, const char ch){if (n < _size){_size = n;_str[n] = '\0';}else{if (n > _capacity){reserve(_capacity * 2);}for (size_t i = _size; i <n; i++){_str[i] = ch;}_size = n;_str[_size] = '\0';}}string& inster(size_t pos,const char ch){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}if (pos >= _size){_str[_size] = ch;}else{size_t end = _size+1;while (pos < end){_str[end] = _str[end-1];--end;}_str[pos] = ch;}++_size;_str[_size] = '\0';return *this;}string& inster(size_t pos,const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + strlen(str));}if (pos >= _size){this->append(str);}else{size_t end = _size + len+1;while (pos < end){_str[end] = _str[end-len];--end;}strncpy(_str+pos,str,len);_size += len;++_size;_str[_size] = '\0';}return *this;}void erase(size_t pos, size_t len=npos){assert(pos < _size);if (pos == npos || pos + len > _size){_str[pos] = '\0';_size = pos;}else{size_t end = pos + len;while (end <= _size){_str[end - len] = _str[end];++end;}_size -= len;_str[_size] = '\0';}}size_t find(char ch,size_t pos = 0){for (; pos <= _size; pos++){if (_str[pos] == ch){return pos;}}}size_t find(char* str, size_t pos = 0){const char* p = strstr(_str + pos, str);if (p == nullptr){return npos;}else{return p - _str;}}private:char* _str;size_t _size;size_t _capacity;const static size_t npos;};const size_t string::npos = -1;ostream& operator<<(ostream& out,const string& s){for (auto ch : s){out << ch;}return out;}istream& operator>>(istream& in, string& s){//这里创建数组为了防止单一的实现,重复调用。通过提取放入数组,结束再赋值。提高效率char ch;ch = in.get();char buff[128] = { '\0' };size_t i = 0;while (ch != ' ' && ch != '\n'){buff[i++] = ch;if (i == 127){s += buff;memset(buff, '\0', 128);i = 0;}ch = in.get();}s += buff;return in;}bool operator<(const string& s1, const string& s2){return strcmp(s1.c_str(), s2.c_str()) < 0;}bool operator==(const string& s1, const string& s2){return strcmp(s1.c_str(), s2.c_str()) == 0;}bool operator<=(const string& s1, const string& s2){return s1 < s2 || s1 == s2;}bool operator>(const string& s1, const string& s2){return strcmp(s1.c_str(), s2.c_str()) > 0;}bool operator>=(const string& s1, const string& s2){return s1 > s2 || s1 == s2;}bool operator!=(const string& s1, const string& s2){return !(s1 == s2);}
};

http://www.lryc.cn/news/161637.html

相关文章:

  • Java 设置免登录请求接口被拦截问题
  • (其他) 剑指 Offer 67. 把字符串转换成整数 ——【Leetcode每日一题】
  • 【MySQL】一文详解MySQL,从基础概念到调优
  • 机器学习——boosting之提升树
  • 解决Spring Boot启动错误的技术指南
  • 使用Spring Security保障你的Web应用安全
  • PostgreSQL本地化
  • MySQL——日志
  • 玩转Mysql系列 - 第18篇:流程控制语句(高手进阶)
  • LED屏幕电流驱动设计原理
  • shell知识点复习
  • 【Sentinel Go】新手指南、流量控制、熔断降级和并发隔离控制
  • iOS自定义滚动条
  • C++知识点2:把数据写进switch case结构,和写进json结构,在使用上有什么区别
  • 肖sir__linux详解__003(vim命令)
  • 瑞芯微RK3588开发板:虚拟机yolov5模型转化、开发板上python脚本调用npu并部署 全流程
  • 【Redis专题】RedisCluster集群运维与核心原理剖析
  • 我眼中的《视觉测量技术基础》
  • 【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN
  • 深入协议栈了解TCP的三次握手、四次挥手、CLOSE-WAIT、TIME-WAIT。
  • 接口自动化测试系列-yml管理测试用例
  • 开源对象存储系统minio部署配置与SpringBoot客户端整合访问
  • Matlab之数组字符串函数汇总
  • 基于深度学习网络的火灾检测算法matlab仿真
  • 【Linux】高级IO和多路转接 | select/poll/epoll
  • el-select 支持多选 搜索远程数据 组件抽取
  • el-table纵向垂直表头
  • Pinyin4j介绍和简单使用
  • 【数据结构】查找
  • 第一次面试