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绑定的函数 自定义类实现按键监听事件的接口 匿名内…...
鲁棒性与稳定性区别
鲁棒性 所谓“鲁棒性”,是指控制系统在一定(结构,大小)的参数摄动下,维持其它某些性能的特性粗携。 稳定性 所谓“稳定性”,是指控制系统在使它偏离平衡状态的扰动作用消失后,返回原来平衡状…...
【组合数学】递推方程特解构造全解析:从多项式到指数形式的实战指南
1. 递推方程特解构造的核心逻辑 第一次接触递推方程特解构造时,我被各种多项式、指数形式绕得头晕。直到把算法复杂度分析中的实际案例拆开来看,才发现这套方法背后的精妙设计。递推方程特解构造的本质,是在已知齐次解的基础上,针…...
手把手教你配置i.MX8MQ的SPI设备树节点:从DTS到驱动匹配的完整流程
i.MX8MQ SPI设备树配置实战:从引脚复用到底层驱动全解析 在嵌入式Linux开发中,SPI总线因其高速、全双工的特性,常被用于连接Flash存储器、触摸屏、传感器等外设。i.MX8MQ作为NXP旗舰级应用处理器,其灵活的引脚复用功能和强大的SPI…...
中文文本自动段落生成:BERT文本分割模型在在线教学中的应用案例
中文文本自动段落生成:BERT文本分割模型在在线教学中的应用案例 你有没有遇到过这样的情况?拿到一份长达几千字的在线课程录音转写稿,或者一场线上会议的完整记录,通篇文字密密麻麻,没有分段,读起来非常吃…...
PaddleOCR 表格识别结果的行对齐优化实践
1. 为什么表格识别需要行对齐优化 第一次用PaddleOCR识别医学检验报告时,我遇到了一个典型问题:明明是人眼一看就懂的整齐表格,OCR输出的结果却像被打乱的拼图。比如"CRP 24 mg/L"这三个关键信息,可能被拆成三个毫不相干…...
保姆级教程:用QGIS 3.34处理OpenStreetMap中国路网数据,从下载.shp到筛选出城市道路
零基础实战:用QGIS 3.34精准提取中国城市路网数据全流程 当你第一次面对OpenStreetMap的海量数据时,是否曾被复杂的文件格式和GIS软件的操作界面劝退?作为城市规划专业的在读研究生,我曾经花了整整两周时间摸索如何从OSM中提取成都…...
给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录
给宇树Go2机器人装‘眼睛’:在Jetson Orin Nano上从零部署YOLOv5的保姆级避坑实录 当四足机器人开始用视觉理解世界时,每个动作都会变得更有灵魂。宇树Go2作为国内领先的消费级机器人平台,其开放的硬件接口为开发者提供了广阔的创新空间。而J…...
Python自动化界面操作:从基础到实战全攻略
一、自动化界面操作概述 1.1 定义 Python自动化界面操作是指通过代码模拟人工的鼠标、键盘操作,或直接调用界面控件API,实现对桌面应用、Web页面、移动端APP等图形界面的自动化控制,无需人工干预即可完成重复性任务。 1.2 常见应用场景场景类…...
deepstream实战指南——环境搭建与依赖管理
1. 环境准备:从零搭建DeepStream开发环境 第一次接触DeepStream的开发者往往会被复杂的依赖关系吓到。我刚开始接触时,光是搞清楚CUDA、cuDNN、TensorRT这些组件的版本对应关系就花了整整两天时间。后来在实际项目中反复搭建环境十几次,才总结…...
ESP32+ENC28J60以太网Web服务器兼容库
1. 项目概述WebServer_ESP32_ENC 是一个专为 ESP32 平台设计的、面向 ENC28J60 以太网控制器的轻量级 Web 服务封装库。其核心定位并非从零构建 TCP/IP 协议栈,而是深度集成 ESP32 官方 SDK 中成熟的 LwIP 协议栈与硬件抽象层(HAL)࿰…...
ElementPlus表单布局陷阱:深度解析`unexpected width 0`的成因与实战规避策略
1. 问题现象与背景 最近在用Vue3ElementPlus开发后台管理系统时,遇到了一个奇怪的警告:ElementPlusError: [ElForm] unexpected width 0。这个警告会在切换登录表单时突然出现,虽然不影响功能,但控制台一片红看着实在闹心。 我当时…...
