string接口的模拟实现
文章目录
- 一. string底层逻辑
- 演示声明和定义分开
- 二. size()
- 三. operator[]
- 四. 迭代器
- 四. const迭代器
- 五. 预留空间(reserve)
- 六. 尾插一个字符push_back
- 七. 尾插一个字符串append
- 八. operator+=
- 九. operator+=
一. string底层逻辑
(1)为了和库里面的string类区分开,我们可以使用命名空间(hou)。之前学习的命名空间就有了价值。
(2)在类里面的都是内联函数
(3)对于比较短小的函数,直接在类里面写就行。函数大一点,将声明和定义分开。
- 成员变量
#include<stdio.h>
#include<string>
#include<iostream>
namespace hou
{class string{private:char* _str; //char类型数据数组的地址size_t _size; //有效元素个数size_t _capacity; //空间大小};
}
- 成员函数
任何一个类都从构造函数开始(无参/有参)
无参的话,将三个成员变量初始化为什么呢?都初始化为空吗?
这样是不可以的。
记得:const char*比较特殊,cout它不会打印出地址,它自动识别类型,会以为打印字符串(字符串的打印规则是遇到‘\0’才会终止),而我们的_str是空指针,将空指针解引用,肯定是错误的(本质是空指针问题)

---------------
所以,不能将char*初始化为空。里面起码要放一个'\0'

namespace hou
{class string{public://任何一个类都从构造函数开始string()//先写一个无参的构造函数:_str(new char[1]{'\0'}),_size(0),_capacity(0){}~string(){delete[] _str;_str = nullptr;_size = 0;_capacity = 0;}const char* c_str()const{return _str;}private:char* _str; //char类型数据数组的地址size_t _size; //有效元素个数size_t _capacity; //空间大小};
}
刚刚写了无参的构造函数,接下来写一个有参的构造函数
注意点:
strlen计算长度时,不包括'\0'- strlen是在运行时计算的,size是编译时计算的
- 在初始化列表里写,它的初始化顺序是按照声明的顺序来的

之前我们说过,尽可能使用初始化列表,但是strlen是在运行时计算的,要计算3次,效率低。这样子的话,我们可以将strlen先计算出来,之后用。但记住,初始化列表的顺序是按照声明的顺序。

演示声明和定义分开
当我们想把声明写在.h里面,定义写在.cpp里面的时候

这样写会报错,所以我们需要在string.cpp里(1)写上类域(2)再写一下命名空间
一个命名空间是可以写多个的,多个文件的同一个命名空间会被合并为(认为)一个命名空间的


已经声明和定义了,还有一个需要注意的内容是,缺省值只能在声明的时候给(定义那里不可以写缺省值)。但是char* _str的缺省值不可以是nullptr,可以给一个'\0'或者直接“”(字符串默认后面会加'\0'的)
二. size()
对象.size()就是为了得到对象的大小(即对象的有效元素个数)
如果声明和定义分开写了,同时这个函数有返回值,那string::加到哪里呢?

三. operator[]
string.cpp里面的内容
char& string::operator[](size_t i)
{return _str[i];
}
四. 迭代器
string的迭代器(string的物理结构是数组)
using iterator = char*;
//typedef char* iterator;
迭代器还需要配合begin()和end()(begin()就是返回开始位置的迭代器)
using iterator = char*;
iterator string::begin()
{return _str;
}
iterator string::end()
{return _str+_size;
}

范围for的底层是迭代器(支持迭代器则支持范围for)

四. const迭代器

五. 预留空间(reserve)
本质就是扩容,但是这种提高了效率,原本需要2倍2倍的扩,但是当你知道需要多大的空间时,就可以一次性扩容好。

- reserve一般不缩容,我们需要先判断一下,想扩容的大小n是否比_capacity大
- 开空间的时候永远要多开一个,因为
’\0‘是不计入_capacity的
void string:: reserve(size_t n){if (n > _capacity){char* tmp=new char[n+1];strcpy(tmp, _str);delete[]_str;_str = tmp;_capacity = n; //'\0'不计入空间大小}}
六. 尾插一个字符push_back
void string::push_back(char ch)
{//先判断空间大小是否足够if (_size = _capacity){//不够的话进入if语句进行扩容reserve(_capacity = 0 ? 4 : 2 * _capacity);}_str[_size] = ch;_size++;
}
七. 尾插一个字符串append
void string::append(const char* str){size_t len = strlen(str);size_t newcapacity = 2 * _capacity < _size + len ? _size + len : 2 * _capacity;reserve(newcapacity);//开好空间之后,插入字符串strcpy(_str+_size, str);//直接复制(第一个参数是复制到哪里(位置),第二个是被复制的串)_size += len;}
八. operator+=
string& string:: operator+=(char ch)
{push_back(ch);return *this;
}
九. operator+=
string& string:: operator+=(const char* str)
{append(str);return *this;
}
相关文章:
string接口的模拟实现
文章目录 一. string底层逻辑演示声明和定义分开 二. size()三. operator[]四. 迭代器四. const迭代器五. 预留空间(reserve)六. 尾插一个字符push_back七. 尾插一个字符串append八. operator九. operator 一. string底层逻辑 (1)为了和库里面…...
sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面
sed使用扩展正则表达式时, -i 要写在 -r 或 -E 的后面 前言 -r 等效 -E , 启用扩展正则表达式 -E是新叫法,更统一,能增强可移植性 , 但老系统,比如 CentOS-7 的 sed 只能用 -r ### Ubuntu24.04-E, -r, --regexp-extendeduse extended regular expressions in the script(fo…...
Verilog HDL可综合与不可综合语句
目录 什么是逻辑综合 可综合语句 不可综合语句 逻辑综合建模建议 综合流程 什么是逻辑综合 所谓逻辑综合就是在标准单元库和特定的设计约束的基础上,把设计的高层次描述转换成优化的门级网表的过程。 标准单元库(工艺库)可以包含简单的…...
tomcat 后台部署 war 包 getshell
1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场:192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下,…...
网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操解析1
文章目录 1、RAID6配置指南(大致步骤)2、注意事项3、截图和视频 网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操 RAID6是一种在存储系统中实现数据冗余和容错的技术,其最多可以容忍两块磁盘同时损坏而不造成数据丢失。RAID…...
前端面试题大汇总:React 篇
基础知识 1. 什么是 React?它的主要特点是什么? React 是一个用于构建用户界面的 JavaScript 库,由 Facebook 开发并维护。它主要用于构建单页应用程序(SPA)和复杂的用户界面。React 的主要特点包括: 组件…...
【prism】遇到一个坑,分享!
背景 我通用prism的方式写了一个弹窗,弹窗绑定一个 Loaded 事件,但是Loaded事件一直不触发!!! 具体过程 我的loaded事件也是通过命令的方式绑定的: <i:Interaction.Triggers><i:EventTrigger EventName="Loaded...
Python+Selenium+Pytest+Allure+ Jenkins webUI自动化框架
Python+Selenium+Pytest+Allure+ Jenkins webUI自动化框架 WebUI接口框架使用的工具...
智象未来(HiDream.ai)技术赋能,开启AR眼镜消费时代
Rokid Jungle 2024合作伙伴暨新品发布会于近日隆重举行,标志着AR眼镜跑步进入消费时代,更预示着ARAI技术融合的新篇章。智象未来(HiDream.ai),作为多模态生成式人工智能技术的领跑者,与Rokid的深度合作&…...
element dialog 2层弹窗数据同步问题
注意:本帖为公开技术贴,不得用做任何商业用途 element dialog 2层弹窗数据同步问题 如果嵌套dialog,也就是多层dialog嵌套 2个input,key用同样的值 会导致内外2层dialog,用相同key值的input会数据同步 原因如下&a…...
向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)
1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典,右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本,很灵活,这里先介绍第一个版本,也是原始版本 Shingling one-hot …...
要素市场与收入分配
生产要素与家庭收入 生产要素:企业用于生产产品或劳务的最初投入,主要分为三类: 劳动:工人的时间和技能 土地:代指自然资源 资本:指的是货币形式的资本,可以供企业用来购置厂房、设备等资本品…...
Web3的核心技术:区块链如何确保信息安全与共享
在互联网不断迭代的进程中,Web3被视为下一代互联网的核心发展方向,其目标是构建更加开放、安全、去中心化的数字生态。在这一过程中,区块链作为核心技术,为信息安全与共享提供了全新解决方案。本文将深入探讨区块链如何在Web3中实…...
2025蓝桥杯(单片机)备赛--扩展外设之UART1的原理与应用(十二)
一、串口1的实现原理 a.查看STC15F2K60S2数据手册: 串口一在590页,此款单片机有两个串口。 串口1相关寄存器: SCON:串行控制寄存器(可位寻址) SCON寄存器说明: 需要PCON寄存器的SMOD0/PCON.6为0,使SM0和SM1一起指定工作模式,这里选择工作模式1,REN位置1,允许接受, …...
Js中的常见全局函数
文章目录 1、encodeURI、decodeURI2、encodeURIComponent、decodeURIComponent3、parseInt4、parseFloat5、String6、Number7、Boolean8、isNaN、Number.isNaN()9、JSON10、toString Js内置了一些函数和变量,全局都可以获取使用(本文归纳非构造函数作用的…...
MySQL连接查询之自连接
自连接 相当于等值连接,只不过是自己连接自己,不像等值连接是两个不同的表之间的 案例 查询员工名和他的上司的名字 select e.last_name,m.last_name from employees e, employees m #把同一张表当成两张不同表 where e.manager_id m.employee_id;...
Python 爬虫 (1)基础 | 基础操作
一、基础操作 1、快速构建一个爬虫 ConvertCurl: https://curlconverter.com/选择URL,点击右键,选择 Copy >> Copy as cURL(bash) 安装JS环境:https://www.jb51.net/python/307069k7q.htm...
JAVA八股与代码实践----如何为springboot设置Servlet容器为jetty,jetty的优点是什么?
1、实践 排除原来的springboot-web依赖(默认是tomcat),加入jetty的依赖 <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…...
idea怎么打开两个窗口,运行两个项目
今天在开发项目的时候,前端希望运行一下以前的项目,于是就需要开两个 idea 窗口,运行两个项目 这里记录一下如何设置:首先依次点击: File -> Settings -> Appearance & Behavior ->System Settings 看到如…...
wend看源码-APISJON
项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范,一个面向数据访问层的ORM 框架。其主要工作流程包括:前端按照既定格式组装 JSON 请求报文,通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句,…...
label-studio的使用教程(导入本地路径)
文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...
python如何将word的doc另存为docx
将 DOCX 文件另存为 DOCX 格式(Python 实现) 在 Python 中,你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是,.doc 是旧的 Word 格式,而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
【笔记】WSL 中 Rust 安装与测试完整记录
#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统:Ubuntu 24.04 LTS (WSL2)架构:x86_64 (GNU/Linux)Rust 版本:rustc 1.87.0 (2025-05-09)Cargo 版本:cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...
jmeter聚合报告中参数详解
sample、average、min、max、90%line、95%line,99%line、Error错误率、吞吐量Thoughput、KB/sec每秒传输的数据量 sample(样本数) 表示测试中发送的请求数量,即测试执行了多少次请求。 单位,以个或者次数表示。 示例:…...
MacOS下Homebrew国内镜像加速指南(2025最新国内镜像加速)
macos brew国内镜像加速方法 brew install 加速formula.jws.json下载慢加速 🍺 最新版brew安装慢到怀疑人生?别怕,教你轻松起飞! 最近Homebrew更新至最新版,每次执行 brew 命令时都会自动从官方地址 https://formulae.…...
论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing
Muffin 论文 现有方法 CRADLE 和 LEMON,依赖模型推理阶段输出进行差分测试,但在训练阶段是不可行的,因为训练阶段直到最后才有固定输出,中间过程是不断变化的。API 库覆盖低,因为各个 API 都是在各种具体场景下使用。…...
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
Canal环境搭建并实现和ES数据同步
作者:田超凡 日期:2025年6月7日 Canal安装,启动端口11111、8082: 安装canal-deployer服务端: https://github.com/alibaba/canal/releases/1.1.7/canal.deployer-1.1.7.tar.gz cd /opt/homebrew/etc mkdir canal…...
JUC并发编程(二)Monitor/自旋/轻量级/锁膨胀/wait/notify/锁消除
目录 一 基础 1 概念 2 卖票问题 3 转账问题 二 锁机制与优化策略 0 Monitor 1 轻量级锁 2 锁膨胀 3 自旋 4 偏向锁 5 锁消除 6 wait /notify 7 sleep与wait的对比 8 join原理 一 基础 1 概念 临界区 一段代码块内如果存在对共享资源的多线程读写操作…...

