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

(C++)string模拟实现

string底层是一个是字符数组

为了跟库里的string区别,所以定义一个命名空间将类string包含

一、构造

1.构造函数

注意:将char*传给const char*是范围缩小,因此只能1:1构造一个

strlen遇到nullptr解引用会报错,因此缺省参数只能设置为" "

string(const char* str = ""):_size(strlen(str))
{if (_size == 0){_capacity = 3;}else{_capacity = _size;}_str = new char[_capacity + 1];strcpy(_str, str);
}

2.拷贝构造

深拷贝:重新开辟一个空间

浅拷贝(值拷贝):拷贝一个指针,指向同一片空间

string(const string& s):_size(s._size),_capacity(s._capacity)
{_str = new char[_capacity + 1];strcpy(_str, s._str);
}

3.析构

内置类型,调用默认成员函数,自定义类型调用默认构造

~string()
{if (_str != NULL){delete[] _str;_str = NULL;}_size = 0;_capacity = 0;
}

4.赋值

赋值运算符也是默认成员函数,如果不写会进行浅拷贝/值拷贝

string& operator=(const string& s)
{_size = s._size;_capacity = s._capacity;delete[] _str;_str = new char[_capacity+1];strcpy(_str, s._str);return *this;
}

二、迭代器

使用typedef 将用iterator代替char*

1.begin

iterator begin()
{return _str;
}

2.end

iterator end()
{return _str + _size;
}

三、修改

1.push_back

void push_back(char c)
{if (_size + 1 > _capacity){reserve(_size + 1);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;}_str[_size] = c;_size++;_str[_size] = '\0';
}

2.+=

复用尾插

string& operator+=(char c)
{push_back(c);return *this;
}

3.append

通过reserve类似扩容的操作,扩大了字符串长度的空间,并且在原字符串‘\0’的位置上拷贝str字符串

void append(const char* str)
{size_t len = strlen(str);if (len + _size > _capacity){reserve(len + _size);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;}strcpy(_str + _size, str);_size += len;
}

4.clear

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

5.swap

void swap(T& a, T& b)
{T tmp = a;a = b;b = tmp;
}
void swap(string& s)
{bit::swap<char*>(_str, s._str);bit::swap<size_t>(_size, s._size);bit::swap<size_t>(_capacity, s._capacity);
}

6.c_str

const char* c_str()const
{const char* tmp = _str;return tmp;
}

四、容量

1.size

	size_t size()const{return _size;}

2.capacity

size_t capacity()const
{return _capacity;
}

3.empty

bool empty()const
{if (_size == 0){return true;}else{return false;}
}

4.resize

分三种情况

n<_size  删除数据

_size<n<_capacity 剩余空间初始化

n>_capacity 扩容+初始化

void resize(size_t n, char c = '\0')
{if (n <= _size){_size = n;_str[n] = '\0';}else{reserve(n);size_t i = _size;while (i < n){_str[i] = c;i++;}_size = n;_str[_size] = '\0';}
}

5.reserve

为防止new失败,所以使用临时变量tmp指向new出来的空间,若new成功,释放旧空间,并将—_str指向新的空间

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

五、访问

1.[ ]

char& operator[](size_t index)
{return _str[index];
}
const char& operator[](size_t index)const
{return _str[index];
}

2."<,<=,>,>=,==,!="

通过strcmp,比较字符串从头开始字符的ASCII值,再通过复用来实现剩下的

const只能调用const,非const既可以调用非const,也可以调用const

bool operator<(const string& s)
{return (*this >= s);
}
bool operator<=(const string& s)
{return !(*this > s);
}
bool operator>(const string& s)
{return (strcmp(_str, s._str) > 0);
}
bool operator>=(const string& s)
{return (*this == s || *this > s);
}
bool operator==(const string& s)
{return strcmp(_str, s._str) == 0;
}
bool operator!=(const string& s)
{return !(*this==s);
}

3.find

size_t find(char c, size_t pos = 0)const
{while (pos < _size){if (_str[pos] == c){return pos;}pos++;}return npos;
}
size_t find(const char* s, size_t pos = 0)const
{const char* p = strstr(_str, s);if (p != nullptr){return _str - p;}return npos;
}

4.insert

注意size_t类型变量没有负数

string& insert(size_t pos, char c)
{if (_size + 1 > _capacity){reserve(_size + 1);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;}size_t end = _size;while (end >= pos){_str[end + 1] = _str[end];;end--;}_str[pos] = c;_size++;_str[_size] = '\0';return *this;
}
string& insert(size_t pos, const char* str)
{size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);char* tmp = new char[_capacity + 1];strcpy(tmp, _str);delete[]_str;_str = tmp;}size_t end = _size;while (end >= pos){_str[end + len] = _str[end];end--;}strncpy(_str + pos, str, len);_size += len;return *this;
}

5.erase

pos位置开始删除len个数据

string& erase(size_t pos, size_t len)
{if (len == npos && len + pos > _size){_str[pos] = '\0';}else{while (pos+len<_size){_str[pos] = _str[pos + len];pos++;}_size -= len;_str[_size] = '\0';}return *this;
}

6.流插入<<

ostream& operator<<(ostream& _cout, const bit::string& s)
{for (int i = 0; i < s._size; i++){_cout << s[i] << "";}_cout << endl;return _cout;
}

7.流提取>>

输入多个值,C++规定 空格/换行是值与值之间的区分

istream& operator>>(istream& _cin, bit::string& s)
{s.clear();char ch = _cin.get();char buf[128];int index = 0;while (ch != ' ' && ch != '\n'){buf[index++] = ch;if (index == 127){buf[index] = '\0';s += buf;index = 0;}ch = _cin.get();}if (index != 0){s += buf;}return _cin;
}

相关文章:

(C++)string模拟实现

string底层是一个是字符数组 为了跟库里的string区别&#xff0c;所以定义一个命名空间将类string包含 一、构造 1.构造函数 注意&#xff1a;将char*传给const char*是范围缩小&#xff0c;因此只能1&#xff1a;1构造一个 strlen遇到nullptr解引用会报错&#xff0c;因此…...

类和对象的学习总结(一)

面向对象和面向过程编程初步认识 C语言是面向过程的&#xff0c;关注过程&#xff08;分析求解问题的步骤&#xff09; 例如&#xff1a;外卖&#xff0c;关注点菜&#xff0c;接单&#xff0c;送单等 C是面向对象的&#xff0c;关注对象&#xff0c;把一件事拆分成不同的对象&…...

力扣22. 括号生成

数字 n 代表生成括号的对数&#xff0c;请你设计一个函数&#xff0c;用于能够生成所有可能的并且有效的括号组合。 示例 1&#xff1a;输入&#xff1a;n 3 输出&#xff1a;["((()))","(()())","(())()","()(())","()()(…...

检测窗口是否最大化兼容 Win10/11

检测窗口是否最大化&#xff08;窗口覆盖或独占全屏&#xff09;兼容 Win10/11 问题描述 在 Win10/11 上有很多 UWP 进程&#xff0c;检测窗口是否最大化将迎来新的挑战。这些窗口以其不能够使用 Win32 的 IsWindowVisible 获取窗口可见性为特征。此时&#xff0c;必须使用 D…...

【qsort函数】

前言 我们要学习qsort函数并利用冒泡函数仿照qsort函数 首先我们要了解一下qsort&#xff08;快速排序&#xff09; 这是函数的的基本参数 void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*)); 简单解释一下 base&#xff1a;指向…...

python类元编程示例-使用类型注解来检查转换属性值的类框架

用三种方式实现使用类型注解来检查转换属性值的类框架 1 __init_subclass__方式 1.1 代码实现 from collections.abc import Callable # <1> from typing import Any, NoReturn, get_type_hints from typing import Dict, Typeclass Field:def __init__(self, name: …...

Python3 笔记:字符串的 zfill() 和 rjust()

1、zfill() 方法返回指定长度的字符串&#xff0c;原字符串右对齐&#xff0c;前面填充0。 语法&#xff1a;str.zfill(width) width &#xff1a;指定字符串的长度。原字符串右对齐&#xff0c;前面填充0。 str1 2546 str2 2 print(str1.zfill(10)) # 运行结果&#xff1…...

SpringBoot项目启动提示端口号占用

Windows环境下&#xff0c;SpringBoot项目启动时报端口号占用&#xff1a; *************************** APPLICATION FAILED TO START ***************************Description:Web server failed to start. Port 8080 was already in use.Action:Identify and stop the proc…...

音视频开发23 FFmpeg 音频重采样

代码实现的功能 目的是 将&#xff1a; 一个采样率为 44100&#xff0c;采样通道为 2&#xff0c;格式为 AV_SAMPLE_FMT_DBL 的 in.pcm 数据 转换成 一个采样率为 48000&#xff0c;采样通道为 1&#xff0c;格式为 AV_SAMPLE_FMT_S16 的 out.pcm 数据 1.重采样 1.1 为什么要重…...

windows系统下安装fnm

由于最近做项目要切换多个node版本&#xff0c;查询了一下常用的有nvm和fnm这两种&#xff0c;对比了一下选择了fnm。 下载fnm 有两种方式&#xff0c;目前最新版本是1.37.0&#xff1a; 1.windows下打开powershell&#xff0c;执行以下命令下载fnm winget install Schniz.f…...

【Linux网络】传输层协议 - UDP

文章目录 一、传输层&#xff08;运输层&#xff09;运输层的特点复用和分用再谈端口号端口号范围划分认识知名端口号&#xff08;Well-Know Port Number&#xff09;两个问题① 一个进程是否可以绑定多个端口号&#xff1f;② 一个端口号是否可以被多个进程绑定&#xff1f; n…...

debugger(四):源代码

〇、前言 终于来到令人激动的源代码 level 了&#xff0c;这里将会有一些很有意思的算法&#xff0c;来实现源代码级别的调试&#xff0c;这将会非常有趣。 一、使用 libelfin 库 我们不可能直接去读取整个 .debug info 段来进行设置&#xff0c;这是没有必要的&#xff0c;…...

基于运动控制卡的圆柱坐标机械臂设计

1 方案简介 介绍一种基于运动控制卡制作一款scara圆柱坐标的机械臂设计方案&#xff0c;该方案控制器用运动控制卡制作一台三轴机械臂&#xff0c;用于自动抓取和放料操作。 2 组成部分 该机械臂的组成部分有研华运动控制卡&#xff0c;触摸屏&#xff0c;三轴圆柱坐标的平面运…...

MongoDBTemplate-基本文档查询

文章目录 流程概述步骤1&#xff1a;创建一个MongoDB的连接步骤2&#xff1a;创建一个查询对象Query步骤3&#xff1a;设置需要查询的字段步骤4&#xff1a;使用查询对象执行查询操作 流程概述 步骤描述步骤1创建一个MongoDB的连接步骤2创建一个查询对象Query步骤3设置需要查询…...

23种设计模式——创建型模式

设计模式 文章目录 设计模式创建型模式单例模式 [1-小明的购物车](https://kamacoder.com/problempage.php?pid1074)工厂模式 [2-积木工厂](https://kamacoder.com/problempage.php?pid1076)抽象⼯⼚模式 [3-家具工厂](https://kamacoder.com/problempage.php?pid1077)建造者…...

idm究竟有哪些优势

IDM&#xff08;Internet Download Manager&#xff09;是一款广受好评的下载管理工具&#xff0c;其主要优势包括&#xff1a; 高速下载&#xff1a;IDM支持最大32线程的下载&#xff0c;可以显著提升下载速度1。文件分类下载&#xff1a;IDM可以根据文件后缀进行分类&#x…...

如何学习Golang语言!

第一部分&#xff1a;Go语言概述 起源与设计哲学&#xff1a;Go语言由Robert Griesemer、Rob Pike和Ken Thompson三位Google工程师设计&#xff0c;旨在解决现代编程中的一些常见问题&#xff0c;如编译速度、运行效率和并发编程。主要特点&#xff1a;Go语言的语法简单、编译…...

Redis系列之淘汰策略介绍

Redis系列之淘汰策略介绍 文章目录 为什么需要Redis淘汰策略&#xff1f;Redis淘汰策略分类Redis数据淘汰流程源码验证淘汰流程Redis中的LRU算法Redis中的LFU算法 为什么需要Redis淘汰策略&#xff1f; 由于Redis内存是有大小的&#xff0c;当内存快满的时候&#xff0c;又没有…...

sql 调优

sql 调优 SQL调优是一个复杂的过程&#xff0c;涉及多个方面&#xff0c;包括查询优化、索引优化、表结构优化等。以下是一些基本的SQL调优策略&#xff1a; 使用索引&#xff1a;确保查询中涉及的列都有适当的索引。 查询优化&#xff1a;避免使用SELECT *&#xff0c;只选取…...

【UML用户指南】-13-对高级结构建模-包

目录 1、名称 2、元素 3、可见性 4、引入与引出 用包把建模元素安排成可作为一个组来处理的较大组块。可以控制这些元素的可见性&#xff0c;使一些元素在包外是可见的&#xff0c;而另一些元素要隐藏在包内。也可以用包表示系统体系结构的不同视图。 狗窝并不复杂&#x…...

前端面试题日常练-day63 【面试题】

题目 希望这些选择题能够帮助您进行前端面试的准备&#xff0c;答案在文末 1. TypeScript中&#xff0c;以下哪个关键字用于声明一个类的构造函数&#xff1f; a) constructor b) init c) create d) initialize 2. 在TypeScript中&#xff0c;以下哪个符号用于声明可选的函…...

GAN的入门理解

这一篇主要是关于生成对抗网络的模型笔记&#xff0c;有一些简单的证明和原理&#xff0c;是根据李宏毅老师的课程整理的&#xff0c;下面有链接。本篇文章主要就是梳理基础的概念和训练过程&#xff0c;如果有什么问题的话也可以指出的。 李宏毅老师的课程链接 1.概述 GAN是…...

43【PS 作图】颜色速途

1 通过PS让画面细节模糊&#xff0c;避免被过多的颜色干扰 2 分析画面的颜色 3 作图 参考网站&#xff1a; 色感不好要怎么提升呢&#xff1f;分享一下我是怎么练习色感的&#xff01;_哔哩哔哩_bilibili https://www.bilibili.com/video/BV1h1421Z76p/?spm_id_from333.1007.…...

定个小目标之刷LeetCode热题(13)

今天来看看这道题&#xff0c;介绍两种解法 第一种动态规划&#xff0c;代码如下 class Solution {public int maxSubArray(int[] nums) {int pre 0, maxAns nums[0];for (int x : nums) {// 计算当前最大前缀和pre Math.max(pre x, x);// 更新最大前缀和maxAns Math.ma…...

【AI大模型】Prompt Engineering

目录 什么是提示工程&#xff08;Prompt Engineering&#xff09; Prompt 调优 Prompt 的典型构成 「定义角色」为什么有效&#xff1f; 防止 Prompt 攻击 攻击方式 1&#xff1a;著名的「奶奶漏洞」 攻击方式 2&#xff1a;Prompt 注入 防范措施 1&#xff1a;Prompt 注…...

centos安装vscode的教程

centos安装vscode的教程 步骤一&#xff1a;打开vscode官网找到历史版本 历史版本链接 步骤二&#xff1a;找到文件下载的位置 在命令行中输入&#xff08;稍等片刻即可打开&#xff09;&#xff1a; /usr/share/code/bin/code关闭vscode后&#xff0c;可在应用程序----编程…...

面试题------>MySQL!!!

一、连接查询 ①&#xff1a;左连接left join &#xff08;小表在左&#xff0c;大表在右&#xff09; ②&#xff1a;右连接right join&#xff08;小表在右&#xff0c;大表在左&#xff09; 二、聚合函数 SQL 中提供的聚合函数可以用来统计、求和、求最值等等 COUNT&…...

英伟达:史上最牛一笔天使投资

200万美元的天使投资&#xff0c;让刚成立就面临倒闭风险的英伟达由危转安&#xff0c;并由此缔造了一个2.8万亿美元的市值神话。 这是全球风投史上浓墨重彩的一笔。 前不久&#xff0c;黄仁勋在母校斯坦福大学的演讲中&#xff0c;提到了人生中的第一笔融资——1993年&#x…...

PDF分页处理:技术与实践

引言 在数字化办公和学习中&#xff0c;PDF文件因其便携性和格式稳定性而广受欢迎。然而&#xff0c;处理大型PDF文件时&#xff0c;我们经常需要将其拆分成单独的页面&#xff0c;以便于管理和分享。本文将探讨如何使用Python编程语言和一些流行的库来实现PDF文件的分页处理。…...

数据可视化——pyecharts库绘图

目录 官方文档 使用说明&#xff1a; 点击基本图表 可以点击你想要的图表 安装&#xff1a; 一些例图&#xff1a; 柱状图&#xff1a; 效果&#xff1a; 折线图&#xff1a; 效果&#xff1a; 环形图&#xff1a; 效果&#xff1a; 南丁格尔图&#xff08;玫瑰图&am…...

ps做游戏下载网站有哪些/百度搜索量统计

泛型介绍&#xff08;C# 编程指南&#xff09;泛型类和泛型方法同时具备可重用性、类型安全和效率&#xff0c;这是非泛型类和非泛型方法无法具备的。泛型通常用在集合和在集合上运行的方法中。.NET Framework 2.0 版类库提供一个新的命名空间 System.Collections.Generic&…...

最早做淘宝客的网站/小程序

一、JDK源码的重要性JDK源码的重要性不言而喻&#xff0c;平时的面试、深入学习等都离不开JDK的源码。当然&#xff0c;JDK源码是非常优秀的代码&#xff0c;我们之所以阅读JDK源码&#xff0c;就是为了理解底层原理、学习优秀的设计模式和思想。不过JDK源码也是相当难啃的知识…...

腾达建设哪里的/整站优化方案

rsync 学习 参考 http://www.cnblogs.com/itech/archive/2009/08/10/1542945.html 模式1 本地直接拷贝&#xff0c; 这个其实是调用了 cp 命令&#xff0c; 跟 rsync 服务器&#xff0c; 客户端无关。 /usr/myapp/logs 是本地日志目录 rsync /usr/myapp/logs /usr/myapp/logs2 …...

深圳专业制作网站的公司哪家好/网站运营课程

原文&#xff1a;Best Practices for Speeding Up Your Web Site 26 开发灵巧的事件处理程序 Develop Smart Event Handlers tag&#xff1a;javascript 如果有太多的事件处理逻辑部署在DOM树的不同元素上&#xff0c;它们的频繁执行会拖慢页面的响应速度。而使用事件委托是一…...

网站可以做哪些内容/app网络推广方案

关键词导读&#xff1a;导出Excel Java导出Excel Java导出有格式ExcelJava有什么方便的类库导出带格式的Excel吗&#xff1f;部分数据如下&#xff1a;ORDERID CUSTOM ORDERDATE FREIGHT10262 Learnthe kernel trade 1996-07-22 48.29 10263 Resources are people 1996-07-23 1…...

js代码网站大全/珠海企业网站建设

RT1052之GPIO与IOMUX原文链接&#xff1a;https://blog.csdn.net/weixin_44021648/article/details/113839882 前提提一句&#xff0c;i.MX RT1052与imx6ul的很多片内外设的架构长的都是一样的。 RT1052 GPIO和IOMUX 一、简介 按照编写STM32程序的思维&#xff0c;其实GPIO和I…...