string 模拟与用法
string 用法
string
string 模拟
#pragma once
#include <assert.h>
#include <string.h>
#include <iostream>namespace sjy
{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;}//默认成员函数string(const char* str = ""){size_t len = strlen(str);_size = len;_capacity = len;_str = new char[_capacity + 1]{ 0 };memcpy(_str, str, sizeof(char) * (_size + 1));}~string(){delete[] _str;_str = nullptr;_size = _capacity = 0;}string(const string& other){_size = other._size;_capacity = other._capacity;_str = new char[_capacity + 1]{ 0 };memcpy(_str, other._str, sizeof(char) * (_size + 1));}string& operator=(const string& other){if (&other != this){string tmp(other);swap(tmp);}return *this;}//size, capacity相关size_t size() const{return _size;}size_t capacity() const{return _capacity;}void resize(size_t n, char c = '\0'){if (n < _size){*(_str + n) = '\0';_size = n;}else{if (n > _capacity){reserve(n);}for (int i = _size; i < n; i++){*(_str + i) = c;}*(_str + n) = '\0';_size = n;}}void reserve(size_t n = 0){if (n > _capacity){_capacity = n;char* tmp = new char[_capacity + 1]{ 0 };memcpy(tmp, _str, sizeof(char) * (_size + 1));delete[] _str;_str = tmp;}}//添加修改相关char& operator[](size_t pos){assert(pos < _size);return *(_str + pos);}const char& operator[](size_t pos) const{assert(pos < _size);return *(_str + pos);}void push_back(char c){if (_size == _capacity){reserve(_capacity == 0 ? 4 : 2 * _capacity);}*(_str + _size) = c;_size++;*(_str + _size) = '\0';}void append(const char* str){size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}for (int i = 0; i <= len; i++){*(_str + _size + i) = *(str + i);}_size += len;}string& operator+=(char c){push_back(c);return *this;}string& operator+=(const char* str){append(str);return *this;}void insert(size_t pos, size_t n, char c){assert(pos <= _size);if (_size + n > _capacity){reserve(_size + n);}for (int i = _size + n; i >= pos + n && i != npos; i--){*(_str + i) = *(_str + i - n);}for (int i = 0; i < n; i++){*(_str + pos + i) = c;}_size += n;}void insert(size_t pos, const char* str){assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity){reserve(_size + len);}for (int i = _size + len; i >= pos + len && i != npos; i--){*(_str + i) = *(_str + i - len);}for (int i = 0; i < len; i++){*(_str + pos + i) = *(str + i);}_size += len;}//删除相关string& erase(size_t pos = 0, size_t len = npos){assert(pos <= _size);if (len == npos || pos + len >= _size){*(_str + pos) = '\0';_size = pos;}else{for (int i = pos + len; i <= _size; i++){*(_str + i - len) = *(_str + i);}_size -= len;}return *this;}//查找与字符串相关size_t find(char c, size_t pos = 0) const{for (int i = pos; i < _size; i++){if (*(_str + i) == c){return i;}}return npos;}size_t find(const char* str, size_t pos = 0) const{const char* ptr = strstr(_str + pos, str);if (ptr == nullptr){return npos;}else{return ptr - _str;}}string substr(size_t pos = 0, size_t len = npos) const{assert(pos < _size);if (len == npos || pos + len > _size){len = _size - pos;}char* tmp = new char[len + 1]{ 0 };for (int i = 0; i < len; i++){*(tmp + i) = *(_str + pos + i);}string str(tmp);delete[] tmp;return str;}//其他const char* c_str(){return _str;}void clear(){_size = 0;*_str = '\0';}void swap(string& str){std::swap(_str, str._str);std::swap(_size, str._size);std::swap(_capacity, str._capacity);}bool operator<(const string& str) const{int size1 = this->_size;int size2 = str._size;int minsize = size1 < size2 ? size1 : size2;for (int i = 0; i < minsize; i++){if (*(_str + i) > *(str._str + i)){return false;}else if (*(_str + i) < *(str._str + i)){return true;}}if (size1 == size2 || size1 > size2){return false;}else if (size1 < size2){return true;}}bool operator==(const string& str) const{if (_size == str._size && memcmp(_str, str._str, sizeof(char) * _size) == 0){return true;}return false;}bool operator>(const string& str) const{return !((*this) < str || (*this) == str);}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;static size_t npos;};size_t string::npos = -1;std::istream& operator>>(std::istream& cin, string& str){str.clear();char c = cin.get();while (c == ' ' || c == '\0'){c = cin.get();}char buff[128] = { 0 };int i = 0;while (c != ' ' && c != '\0'){buff[i++] = c;if (i == 127){str += buff;i = 0;}c = cin.get();}if (i != 0){*(buff + i) = '\0';str += buff;}return cin;}std::ostream& operator<<(std::ostream& cout, const string& str){for (auto c: str){cout << c;}return cout;}
}
相关文章:
string 模拟与用法
string 用法 string string 模拟 #pragma once #include <assert.h> #include <string.h> #include <iostream>namespace sjy {class string{public://迭代器相关typedef char* iterator;typedef const char* const_iterator;iterator begin(){return _st…...

[NLP] LLM---<训练中文LLama2(一)>训练一个中文LLama2的步骤
一 数据集 【Awesome-Chinese-LLM中文数据集】 【awesome-instruction-dataset】【awesome-instruction-datasets】【LLaMA-Efficient-Tuning-数据集】Wiki中文百科(25w词条)wikipedia-cn-20230720-filteredBaiduBaiKe(563w词条) …...

华为云云耀云服务器L实例使用教学 | 利用华为云服务器搭建--> 基于Spring Boot+WebSocket+WebRtc实现的多人自习室
文章目录 1. 购买华为云服务器L2. 在华为云服务器上搭建项目前期准备工作1. 更换登录密码2. 安全组配置 3. 在服务器上运行自己的项目 1. 购买华为云服务器L 在有优惠券的情况下,来到华为云这个网址下面,链接为:https://www.huaweicloud.com…...

Postman应用——接口请求(Get和Post请求)
文章目录 新增请求接口请求Get接口请求Post 这里只讲用的比较多的Get和Post请求方式,也可以遵循restful api接口规范,使用其他请求方式。 GET(SELECT):从服务器取出资源(一项或多项)POST&#…...

k8s pod概念、分类及策略
目录 一.pod相关概念 2.Kubrenetes集群中Pod两种使用方式 3.pause容器的Pod中的所有容器共享的资源 4.kubernetes中的pause容器主要为每个容器提供功能: 6.Pod分为两类: 二.Pod容器的分类 1.基础容器…...
C++系列-左移运算符重载
左移运算符重载 左移运算符的应用左移运算符的重载 左移运算符的应用 左移运算符,左移第一个操作数的位,第二个操作数决定要移动的位置左移运算符还可以用于输出调试,cout << “Hello” << endl; 左移运算符的重载 左移运算符…...
【Vue】vue中v-if的用法
v-if是Vue.js中常用的条件渲染指令,根据表达式的值来动态控制元素的显示或隐藏。具体的使用方法如下: 1.基本语法 <div v-if"condition"><!-- content --> </div>其中,v-if后面跟着一个表达式condition&#x…...

企业架构LNMP学习笔记54
企业架构NoSQL数据库之MongoDB。 学习目标和内容: 1)能够简单描述mongoDB的使用特点: 2)能够安装配置启动MongoDB; 3)能够使用命令行客户端简单操作MongoDB; 4)能够实现基本的数…...

C【函数】
1.常用API 1.strcpy:#include<string.h> char * strcpy ( char * destination, const char * source );int main(){char arr1[] "bit";char arr2[20] "###########";// bit\0########strcpy(arr2, arr1);printf("…...

【简单教程】利用Net2FTP构建免费个人网盘,实现便捷的文件管理
文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一,特别是智能设备的大面积使用,无论是个人…...

05-Flask-Flask查询路由方式
Flask查询路由方式 前言命令行方式代码实现返回所有路由 前言 本篇来学习下Flask中查询路由的方式 命令行方式 # window 用set linux 用 export set FLASK_APPtest_6_flask运行发方式# 打印所有路由 flask routes代码实现返回所有路由 # -*- coding: utf-8 -*- # Time …...

lua环境搭建数据类型
lua作为一门计算机语言,从语法角度个人感觉还是挺简洁的接下来我们从0开始学习lua语言。 1.首先我们需要下载lua开发工具包 在这里我们使用的工具是luadist 下载链接为:https://luadist.org/repository/下载后的压缩包解压后就能用。 2.接下来就是老生…...

c++11的一些新特性
c11 1. {}初始化2. 范围for循环3. final与override4. 右值引用4.1 左值引用和右值引用4.2 左值引用与右值引用比较 5. lambda表达式6. 声明6.1 auto6.2 decltype6.3 nullptr 7. 可变参数模版 1. {}初始化 在C中,使用花括号初始化的方式被称为列表初始化。列表初始化…...

K8S名称空间和资源配额
Kubernetes 支持多个虚拟集群,底层依赖于同一个物理集群。 这些虚拟集群被称为名称空间。名称空间namespace是k8s集群级别的资源,可以给不同的用户、租户、环境或项目创建对应的名称空间,例如,可以为test、dev、prod环境分别创建各…...

鼠标拖拽拖动盒子时,与盒子内某些点击事件冲突问题解决
目录 问题解决思路解决代码(标注【主要代码】的为重点) 问题 拖动该悬浮球时,鼠标弹起可能会触发悬浮球内事件 解决思路 鼠标拖动盒子时,将 isMove 设为 true 意为正在拖动盒子,此时将 class"btns_move" 遮…...

PMP项目管理证书是什么?有什么用?
什么是PMP证书? PMP全称是Project Management Professional,中文全称叫项目管理专业人士资格认证,是由美国项目管理协会(PMI)发起,严格评估项目管理人员知识技能是否具有高品质的资格认证考试,目的是为了给项目管理人…...
iframe的父子通讯
最近有个需求是在父页面打开一个弹窗,然后弹窗里面是一个iframe,在关闭弹窗时需要把iframe中的audio标签的音频链接清空和做一些其他的操作。因为以前很少接触iframe,所以对它有点陌生,在经过大佬的指点和上网查阅后找到了解决方法…...

使用docker创建minio镜像并上传文件,提供demo
使用docker创建minio镜像并上传文件,提供demo 1. 整体描述2. 环境搭建2.1 windows环境搭建2.2 docker部署 3. spring集成3.1 添加依赖3.2 配置文件3.3 创建config类3.4 创建minio操作类3.5 创建启动类3.6 测试controller 4. 测试操作4.1 demo运行4.2 页面查看4.3 上…...

02 java ---- Android 基础app开发
目录 相对布局 显示一个美女 显示两个美女 安卓APP启动过程 安卓布局控件 常用布局之相对布局 常用布局之相对布局 padding和margin 按键美化 常用布局之线性布局 安卓按键响应的几种方式 直接设置按键的onClick绑定的函数 自定义类实现按键监听事件的接口 匿名内…...
鲁棒性与稳定性区别
鲁棒性 所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性粗携。 稳定性 所谓“稳定性”,是指控制系统在使它偏离平衡状态的扰动作用消失后,返回原来平衡状…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

工业安全零事故的智能守护者:一体化AI智能安防平台
前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...
【学习笔记】深入理解Java虚拟机学习笔记——第4章 虚拟机性能监控,故障处理工具
第2章 虚拟机性能监控,故障处理工具 4.1 概述 略 4.2 基础故障处理工具 4.2.1 jps:虚拟机进程状况工具 命令:jps [options] [hostid] 功能:本地虚拟机进程显示进程ID(与ps相同),可同时显示主类&#x…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化
缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别
【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而,传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案,能够实现大范围覆盖并远程采集数据。尽管具备这些优势…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...