【C++】string的主要功能模拟复现
经常调用的短小函数直接定义在头文件中,可以节省时间开销
#include<iostream>
#include<assert.h>
using namespace std;
namespace mumu
{class string{friend ostream& operator<<(ostream& _cout, const mumu::string& s);friend istream& operator>>(istream& _cin, mumu::string& s);public:typedef char* iterator;typedef const char* const_iterator;string(const char* str = ""){_size = strlen(str);_capacity = _size;_str = new char[_capacity + 1];strcpy(_str, str);}string(const string& s){_size = s.size();_capacity = s._capacity;_str = new char[_capacity + 1];strcpy(_str, s._str);}string& operator=(const string& s){if (*this == s){return *this;}_size = s._size;_capacity = s._capacity;_str = new char[_capacity + 1];strcpy(_str, s._str);return *this;}~string(){if (_str){delete[] _str;_str = nullptr;_size = _capacity = 0;}}// iteratoriterator begin(){return _str;}const_iterator begin() const{return _str;}iterator end(){return _str + _size;}const_iterator end() const{return _str + _size;}// modifyvoid push_back(char c);string& operator+=(char c);void append(const char* str);string& operator+=(const char* str);void clear(){_str[0] = '\0';_size = 0;}void swap(string& s){string tmp;tmp = *this;*this = s;s = tmp;}const char* c_str()const{return _str;}// capacitysize_t size() const{return _size;}size_t capacity() const{return _capacity;}bool empty()const{return _size == 0;}void resize(size_t n, char c = '\0');void reserve(size_t n);// accesschar& operator[](size_t index){assert(index<_size);return _str[index];}const char& operator[](size_t index)const{assert(index < _size);return _str[index];}//relational operatorsbool operator<(const string& s);bool operator<=(const string& s);bool operator>(const string& s);bool operator>=(const string& s);bool operator==(const string& s);bool operator!=(const string& s);// 返回c在string中第一次出现的位置size_t find(char c, size_t pos = 0) const;// 返回子串s在string中第一次出现的位置size_t find(const char* s, size_t pos = 0) const;// 在pos位置上插入字符c/字符串str,并返回该字符的位置string& insert(size_t pos, char c);string& insert(size_t pos, const char* str);// 删除pos位置上的元素,并返回该元素的下一个位置string& erase(size_t pos, size_t len = npos);string substr(size_t pos=0, size_t len = npos);private:char* _str = nullptr;size_t _capacity = 0;size_t _size = 0;static const size_t npos;};
};
string模拟实现的源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"string.h"
namespace mumu
{const size_t string::npos = -1;ostream& operator<<(ostream& _cout, const mumu::string& s){for (auto ch : s){_cout << ch;}return _cout;}istream& operator>>(istream& _cin, mumu::string& s){char ch;ch = _cin.get();while (ch != ' ' && ch != '\n'){s += ch;ch = _cin.get();}return _cin;}void string::push_back(char c){if (_size == _capacity){reserve(_capacity == 0 ? 4 : _capacity * 2);}_str[_size] = c;_str[++_size] = '\0';}string& string::operator+=(char c){push_back(c);return *this;}void string::append(const char* str){size_t length = strlen(str);if (_size + length > _capacity){reserve(_size + length > 2 * _capacity ? _size + length : _capacity * 2);}strcpy(_str + _size, str);_size += length;}string& string::operator+=(const char* str){append(str);return *this;}void string::resize(size_t n, char c ){assert(n <= _size);_str[n] = c;if (c == '\0'){_size = n;}}void string::reserve(size_t n){if (n > _capacity){char* tmp = new char[n + 1];strcpy(tmp, _str);delete[] _str;_str = tmp;_capacity = n;}}bool string::operator<(const string& s){return !(*this >= s);}bool string::operator<=(const string& s){return !(*this > s);}bool string::operator>(const string& s){return strcmp(this->c_str(), s.c_str()) > 0;}bool string::operator>=(const string& s){return (*this > s) || (*this == s);}bool string::operator==(const string& s){return strcmp(this->c_str(), s.c_str())==0;}bool string::operator!=(const string& s){return !(*this == s);}// 返回c在string中第一次出现的位置size_t string::find(char c, size_t pos) const{assert(pos < _size);for (size_t i = pos; i < _size; i++){if (_str[i] == c){return i;}}return npos;}// 返回子串s在string中第一次出现的位置size_t string::find(const char* s, size_t pos) const{assert(pos < _size);const char* ptr = strstr(_str + pos, s);if (ptr == nullptr){return npos;}else{return ptr - _str;}}// 在pos位置上插入字符c/字符串str,并返回该字符的位置string& string::insert(size_t pos, char c){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] = c;++_size;return *this;}string& string::insert(size_t pos, const char* str){assert(pos <= _size);size_t length = strlen(str);if (_size + length > _capacity){reserve(_size + length > 2 * _capacity ? _size + length : 2 * _capacity);}size_t end = _size + length;while (end > pos + length - 1){_str[end] = _str[end - length];--end;}for (size_t i = 0; i < length; i++){_str[pos + i] = str[i];}_size += length;return *this;}// 删除pos位置上的元素,并返回该元素的下一个位置string& string::erase(size_t pos, size_t len){assert(pos < _size);if (len >= _size - pos){_str[pos] = '\0';_size = pos;}else{for (size_t i = pos + len; i <= _size; i++){_str[i - len] = _str[i];}_size -= len;}return *this;}string string::substr(size_t pos, size_t len){assert(pos < _size);// len大于剩余字符长度,更新一下lenif (len > _size - pos){len = _size - pos;}string sub;sub.reserve(len);for (size_t i = 0; i < len; i++){sub += _str[pos + i];}return sub;}};
测试用主函数源代码
#define _CRT_SECURE_NO_WARNINGS 1
#include"string.h"
using namespace mumu;void test_string1()
{mumu::string s1;mumu::string s2("hello world");cout << s1.c_str() << endl;cout << s2.c_str() << endl;for (size_t i = 0; i < s2.size(); i++){s2[i] += 2;}cout << s2.c_str() << endl;for (auto e : s2){cout << e << " ";}cout << endl;mumu::string::iterator it = s2.begin();while (it != s2.end()){//*it += 2;cout << *it << " ";++it;}cout << endl;
}void test_string2()
{mumu::string s1("hello world");s1 += 'x';s1 += '#';cout << s1.c_str() << endl;s1 += "hello bit";cout << s1.c_str() << endl;s1.insert(5, '$');cout << s1.c_str() << endl;s1.insert(0, '$');cout << s1.c_str() << endl;mumu::string s2("hello world");cout << s2.c_str() << endl;s2.insert(5, "$$$");cout << s2.c_str() << endl;s2.insert(0, "$$$&&&&&&&&&&&&&&&&&&&&&&&&&&&&&");cout << s2.c_str() << endl;
}void test_string3()
{mumu::string s1("hello world");s1.erase(6, 100);cout << s1.c_str() << endl;mumu::string s2("hello world");s2.erase(6);cout << s2.c_str() << endl;mumu::string s3("hello world");s3.erase(6, 3);cout << s3.c_str() << endl;
}void test_string4()
{mumu::string s("test.cpp.zip");size_t pos = s.find('.');mumu::string suffix = s.substr(pos);cout << suffix.c_str() << endl;mumu::string copy(s);cout << copy.c_str() << endl;s = suffix;cout << suffix.c_str() << endl;cout << s.c_str() << endl;s = s;cout << s.c_str() << endl;
}void test_string5()
{mumu::string s1("hello world");mumu::string s2("hello world");cout << (s1 < s2) << endl;cout << (s1 == s2) << endl;//cout << ("hello world" < s2) << endl;cout << (s1 == "hello world") << endl;//cout << ("hello world" == "hello world") << endl;cout << s1 << s2 << endl;mumu::string s0;cin >> s0;cout << s0 << endl;
}void test_string6()
{mumu::string s1("hello world");mumu::string s2 = s1;cout << s1 << endl;cout << s2 << endl;mumu::string s3("xxxxxxxxxxxxxx");s1 = s3;cout << s1 << endl;cout << s3 << endl;
}void test_string7()
{mumu::string s1("hello world");mumu::string s2("xxxxxxxxxxxxxxxxxxxxxxxx");std::swap(s1, s2);s1.swap(s2);
}int main()
{test_string7();return 0;
}
相关文章:
【C++】string的主要功能模拟复现
经常调用的短小函数直接定义在头文件中,可以节省时间开销 #include<iostream> #include<assert.h> using namespace std; namespace mumu {class string{friend ostream& operator<<(ostream& _cout, const mumu::string& s);friend…...
Linux环境安装Jenkins
Linux环境安装Jenkins Jenkins和JDK的版本 Jenkins和JDK的版本需要对应,不然无法正常启动。 Jenkins稳定版下载地址 Jenkins服务 手动使用命令启动和关闭Jenkins比较麻烦,所以可以把Jenkins设置成开机启动。 创建Jenkins.sh文件 JAVA_HOME和jenk…...
Elasticsearch:ES|QL 中的全文搜索 - 8.17
细心的开发者如果已经阅读我前两天发布的文章 “Elastic 8.17:Elasticsearch logsdb 索引模式、Elastic Rerank 等”,你就会发现在 8.17 的发布版中,有一个重要的功能发布。那就是 ES|QL 开始支持全文搜索了。在今天的文章中我们来尝试一下。…...
Leetcode 3387. Maximize Amount After Two Days of Conversions
Leetcode 3387. Maximize Amount After Two Days of Conversions 1. 解题思路2. 代码实现 题目链接:3387. Maximize Amount After Two Days of Conversions 1. 解题思路 这一题思路上其实就是要分别求出day 1以及day 2中原始货币与其他各个货币之间的成交价&…...
Lumos学习王佩丰Excel第二十一讲:经典Excel动态图表实现原理
一、动态图表实现原理 1、理解图表中的数据系列 在Excel图表中,系列指的是图表中的数据集合,它通常代表着一个数据源。每个系列都可以包含多个数据点,这些数据点在图表中以特定的形式展现,如柱状图中的柱子,折线图中…...
静态路由、RIP、OSPF、BGP的区别
静态路由:是管理员手动将路由写入到路由器中,配置简单开销小,但不能适应网络变化,只用于小型的网络 RIP,路由信息协议,属于距离矢量路由协议的一种,根据跳数来判断最优路由,如果跳数…...
解决 Flutter 在 Mac 上的编译错误
解决 Flutter 在 Mac 上的编译错误 在使用 Flutter 进行项目开发并尝试在 Mac 设备上进行编译时,遇到了一系列的错误信息,这些错误信息给项目的构建与部署带来了阻碍。 一、错误详情 在编译过程中,Xcode 输出了大量的信息,其中…...
ECharts实现数据可视化入门详解
文章目录 ECharts实现数据可视化入门详解一、引言二、基础配置1.1、代码示例 三、动态数据与交互2.1、代码示例 四、高级用法1、多图表组合1.1、在同一容器中绘制多个图表1.2、创建多个容器并分别初始化 ECharts 实例1.3、实现多图联动 五、总结 ECharts实现数据可视化入门详解…...
LRM-典型 Transformer 在视觉领域的应用,单个图像生成3D图像
https://yiconghong.me/LRM. 一、Abstract 第一个大型重建模型(LRM),它可以在5秒内从单个输入图像预测物体的3D模型。LRM采用了高度可扩展的基于transformer的架构,具有5亿个可学习参数,可以直接从输入图像中预测神经…...
Stream– ESP8266物联网应用,(客户端向服务器发送数据信息 客户端向服务器请求数据信息)
Stream– ESP8266物联网应用 Stream对于ESP8266-Arduino语言来说指的是数据序列。请留意:在C编程中Stream常被翻译作“流”。我们认为将Stream称为数据序列更加直观。因为数据序列这一概念有两个很关键特点。 第一个特点是“序”,即数据序列不能是杂乱…...
win10系统右下角没有显示网络图标 , 打开或关闭系统图标网络灰色
win10系统右下角没有显示网络图标 / 打开或关闭系统图标网络灰色 win10系统右下角没有显示网络图标, 并且打开或关闭系统图标网络灰色 解决方案: 首先,按【Ctrl Alt Del】组合键,然后点击【任务管理器】。任务管理器窗口,找到并选择【Wind…...
Python使用Selenium库获取 网页节点元素、名称、内容的方法
我们要用到一些网页源码信息,例如获取一些节点的class内容, 除了使用Beautifulsoup来解析,还可以直接用Selenium库打印节点(元素)名称,用来获取元素的文本内容或者标签名。 例如获取下面的class的内容&am…...
onnx文件转pytorch pt模型文件
onnx文件转pytorch pt模型文件 1.onnx2torch转换及测试2.存在问题参考文献 从pytorch格式转onnx格式,官方有成熟的API;那么假如只有onnx格式的模型文件,该怎样转回pytorch格式? https://github.com/ENOT-AutoDL/onnx2torch提供了…...
计算机网络中的SIP协议是什么?
SIP(Session Initiation Protocol,会话初始化协议)是由IETF(Internet Engineering Task Force,因特网工程任务组)制定的多媒体通信协议。以下是对SIP的详细简述: 一、SIP的基本概念 SIP是一个…...
Apache Kylin最简单的解析、了解
官网:Overview | Apache Kylin 一、Apache Kylin是什么? 由中国团队研发具有浓厚的中国韵味,使用神兽麒麟(kylin)为名 的一个OLAP多维数据分析引擎:(据官方给出的数据) 亚秒级响应ÿ…...
axfbinhexelf文件区别
0 Preface/Foreword axf,bin,hex,elf四个都能存在于嵌入式软件领域。 1 文件介绍 嵌入式软件中常见的文件包含: axf,包含调试信息,文件最大。调试信息放在机器码前面。elfhex,包含地址信息,文件内容较大。bin&#x…...
MySQL表自增id溢出的故障复盘,你是如何解决与监控的
文章精选推荐 1 JetBrains Ai assistant 编程工具让你的工作效率翻倍 2 Extra Icons:JetBrains IDE的图标增强神器 3 IDEA插件推荐-SequenceDiagram,自动生成时序图 4 BashSupport Pro 这个ides插件主要是用来干嘛的 ? 5 IDEA必装的插件&…...
03、SpirngMVC核心(下)
一、关于RESTful编程风格 什么是RESTful RESTful的英文全称是:Representational State Transfer(表述性状态转移) RESTful是Web服务接口的一种设计风格。它定了一组约束和规范,可以让Web服务接口更加简洁、易于理解、易于扩展、安全可靠。 RESTful对于请求的约束如下:…...
【游戏设计原理】10 - 科斯特的游戏理论
科斯特的游戏理论强调了游戏与学习之间的关系,认为“玩得开心”与“学习”是紧密相连的。换句话说,游戏的核心魅力在于通过适当的挑战和不断的学习进程激发玩家的内啡肽循环,这让玩家在不断的探索和进步中找到乐趣。 科斯特的理论通过游戏是…...
【JAVA】Java项目实战—Java EE项目:客户关系管理(CRM)系统
Java EE项目:客户关系管理(CRM)系统 一、背景介绍 1.1 Java语言的重要性 Java是一种广泛使用的编程语言,因其跨平台性、面向对象特性以及丰富的生态系统而受到开发者的青睐。Java EE(Enterprise Edition)…...
JAVA 零拷贝技术和主流中间件零拷贝技术应用
目录 介绍Java代码里面有哪些零拷贝技术java 中文件读写方式主要分为什么是FileChannelmmap实现sendfile实现 文件IO实战需求代码编写实战IOTest.java 文件上传阿里云,测试运行代码看耗时为啥带buffer的IO比普通IO性能高?BufferedInputStream为啥性能高点…...
STM32软件IIC驱动TCA9548A多路测量AHT10
STM32软件IIC驱动TCA9548多路测量AHT10 TCA9548AAHT10代码逻辑代码展示现象总结 TCA9548A TCA9548A 有八个可通过 I2C 总线控制的双向转换开关,SCL/SDA 上行对扩展到八个下行对,或者通道,适用于系统中存在I2C目标地址冲突的情况。8路双向转换…...
博弈论3:图游戏SG函数(Graph Games)
目录 一、图游戏是什么 1.游戏特征 2.游戏实例 二、图游戏的必胜策略 1.SG 函数(Sprague-Grundy Function) 2.必胜策略(利用SG函数) 3.拿走游戏转化成图游戏(Take-away Game -> Graph Game) 一、图…...
音视频入门基础:MPEG2-TS专题(17)——FFmpeg源码中,解析TS program map section的实现
一、引言 由《音视频入门基础:MPEG2-TS专题(16)——PMT简介》可以知道,PMT表(Program map table)由一个或多个段(Transport stream program map section,简称TS program map sectio…...
SQL server学习05-查询数据表中的数据(上)
目录 一,基本格式 1,简单的SQL查询语句 2,关键字TOP 3,关键字DISTINCT 二,模糊查询 1,通配符 三,对结果集排序 1,不含关键字DISTINCT 2,含关键字DISTINCT 3&…...
Transformer记录Attention is all you need
视频: Transformer 原理详解_哔哩哔哩_bilibili 代码: harvardnlp/annotated-transformer: An annotated implementation of the Transformer paper....
JAVA入门:使用IDE开发
JAVA入门:使用IDE开发 什么是IDE IDE(Integrated Development Environment,集成开发环境)是一种软件应用程序,它为程序开发、软件设计、项目管理等提供全面的设施。 简单来说就是简化开发过程,让编程更加…...
汽车嵌入式软件构建高效技术团队的全面思考
在汽车嵌入式软件开发领域,构建一支高效的通用技术团队至关重要。这类团队负责为各种项目提供可复用、标准化的技术基石,从而提高开发效率、降低成本并确保产品质量。构建这样的团队需要从技术能力、角色分工、标准化与复用、流程管理与质量保证、工具和…...
Debezium源码分析: TopicSelector实现原理与应用
Debezium源码分析: TopicSelector实现原理与应用 Debezium源码分析: TopicSelector实现原理与应用文章目录背景介绍主要功能应用场景实现原理DataCollectionId 接口核心设计工作流程源码分析基础实现默认选择器创建应用示例1. 分库分表场景2. 多租户场景3. 业务领域分组总结设计…...
SpringCloud微服务实战系列:03spring-cloud-gateway业务网关灰度发布
目录 spring-cloud-gateway 和zuul spring webflux 和 spring mvc spring-cloud-gateway 的两种模式 spring-cloud-gateway server 模式下配置说明 grayLb://system-server 灰度发布代码实现 spring-cloud-gateway 和zuul zuul 是spring全家桶的第一代网关组件&#x…...
【恶意软件检测论文】通过提取 API 语义来实现的一个新颖的安卓恶意软件检测方法
目录 摘要1. 引言2. 相关工作2.1. 基于重新训练的恶意软件检测2.2. 基于应用关系图的恶意软件检测2.3. 基于异常样本识别的恶意软件检测2.4. 基于API聚类的恶意软件检测 3. AMDASE概述4. 基于语义距离的API聚类4.1. API特征提取4.2. API句子生成4.3. API句子编码4.4.聚类中心生…...
大模型系列4--开源大模型本地部署到微调(WIP)
背景 一直想真正了解大模型对硬件资源的需求,于是准备详细看一篇视频,将核心要点总结记录下。本文内容参考视频:保姆级教程:6小时掌握开源大模型本地部署到微调,感谢up主 训练成本 训练 > 微调 > 推理训练GPT…...
Linux 磁盘满了怎么办?快速排查和清理方法
当 Linux 磁盘满了,会导致系统无法正常运行,比如无法写入文件、服务停止、甚至系统崩溃。因此,快速排查并清理磁盘空间是非常重要的。以下是详细的排查和解决步骤: 一、快速定位磁盘占用原因 1. 检查磁盘使用情况 使用 df 命令查…...
go 协程练习例题
go 协程练习例题 例1:统计 1-200000 的数字中,哪些是素数例2:使用单通道、2个协程交替读取字符串例3:使用1个管道,2个协程写数据、1个协程读例4:完成一个并发任务调度器,按照指定顺序执行一系列…...
JAVA:访问者模式(Visitor Pattern)的技术指南
1、简述 访问者模式(Visitor Pattern)是一种行为型设计模式,允许你将操作分离到不同的对象中,而无需修改对象本身的结构。这种模式特别适合复杂对象结构中对其元素进行操作的场景。 本文将介绍访问者模式的核心概念、优缺点,并通过详细代码示例展示如何在实际应用中实现…...
如何实现邮箱+验证码登录功能(express+vue+MySQL版)
目录 1. 初始化项目2. 配置环境变量3. 更新数据库4. 编写路由函数5. 前端调用接口 1. 初始化项目 前端根目录:/web 后端根目录:/api_server 安装依赖: npm install express mysql nodemailer randomstring dotenv其中,nodemaile…...
Pycharm访问MySQL数据库·上
1.MySQL驱动模块Connector #导入数据库的驱动工具 import mysql.connector #连接数据库必备的条件 config {"host": "localhost","port": 3306,"user": "root","password": "888888","database&…...
vscode+msys2+clang+xmake c++开发环境搭建
转载请标明出处:小帆的帆的专栏 安装msys2 下载msys2安装包:清华源下载地址安装msys2:安装目录,C:\Softwares\msys64 安装cling工具链,xmake !!!在开始菜单中启动MSYS2 CLANG64,…...
Python面试常见问题及答案5
一、基础语法相关 问题1: Python的可变数据类型和不可变数据类型有哪些? 答案: 在Python中,可变数据类型有列表(list)、字典(dict)、集合(set)。这些数据类型…...
威联通docker无法拉取镜像
链接:威联通TS-464C 折腾--Container Station国内无法拉取镜像_docker_wangguanghe-开放原子开发者工作坊我这里用的是IPV6 ,没有公网资源啊。 wangguanghe...
3D 生成重建034-NerfDiff借助扩散模型直接生成nerf
3D 生成重建034-NerfDiff借助扩散模型直接生成nerf 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 感觉这个论文可能能shapE差不多同时期工作,但是shapE是生成任意种类。 本文提出了一种新颖的单图像视图合成方法NerfDiff,该方法利用神经辐射场 …...
ASP.net Core EntityFramework Code EF code 汇总
Entity FrameWork EF 总结 EF Core EF Core 如果实体模型很多,全部放在 上下文中的 OnModelCreating(ModelBuilder modelBuilder) 不太好维护 可以把实体模型 分离出去,每个类创建一个实体模型 public class BookConfiguration :IEntityT…...
AtCoder Beginner Contest 384 Solution
文章目录 ABCDEFG A void solve() {string s; char x, y;qr(n, x, y, s);for(auto i: s) {if(i ! x) i y;cout << i;} }B void solve() {qr(n, m);for (int i 1; i < n; i) {int x, y;qr(x, y);x--;if(1600 - x * 400 < m && m < 2799 - x * 400) m…...
c# TaskScheduler
这里记录下 TaskScheduler 的简单用法。 使用场景: 使用 Task 的时候,大家知道用 TaskFactory.StartNew 可以用来创建一个 Task 。这里如果创建了 3 个,那么这3个 Task 就各自放飞直接运行了。 class Program {private static TaskFactory…...
FFMPEG视频转图片
用FFMPEG视频转图片,并且for循环 import os import subprocess# 输入文件夹和输出文件夹路径 input_folder r"I:\xxx" output_base_folder r"D:\xxx\YOLO\data\video" output_subfolder_name "20240609"# 创建输出子文件夹 output…...
激活函数-swiGLU
swiGLU(Switch Gated Linear Unit)简介 swiGLU 是一种改进的激活函数模块,主要用于深度学习中的 Transformer 模型和其他神经网络架构。它在 GLU(Gated Linear Unit) 的基础上进行了修改,以提升模型的表现…...
PCIe学习笔记
PCIE高速串行数据总线 当拿到一块板子 比如你要用到PCIE 首先要看这块板子的原理图 一般原理图写的是 PCI express 表示PCIE 以下是Netfpga为例下的PCIE插口元件原理图 ——PMT简介
一、引言 PMT(Program Map Table)与PAT表成对出现,其PID由PAT表给出。通过PMT表可以得到该节目包含的视频和音频信息,从而找到音视频流: 二、PMT表中的属性 根据《T-REC-H.222.0-202106-S!!PDF-E.pdf》第79页&#x…...