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

string接口的模拟实现

文章目录

  • 一. string底层逻辑
    • 演示声明和定义分开
  • 二. size()
  • 三. operator[]
  • 四. 迭代器
  • 四. const迭代器
  • 五. 预留空间(reserve)
  • 六. 尾插一个字符push_back
  • 七. 尾插一个字符串append
  • 八. operator+=
  • 九. operator+=

一. string底层逻辑

(1)为了和库里面的string类区分开,我们可以使用命名空间(hou)。之前学习的命名空间就有了价值。
(2)在类里面的都是内联函数在这里插入图片描述
(3)对于比较短小的函数,直接在类里面写就行。函数大一点,将声明和定义分开。

  1. 成员变量
#include<stdio.h>
#include<string>
#include<iostream>
namespace hou
{class string{private:char* _str;    //char类型数据数组的地址size_t _size;  //有效元素个数size_t _capacity; //空间大小};
}
  1. 成员函数
    任何一个类都从构造函数开始(无参/有参)

无参的话,将三个成员变量初始化为什么呢?都初始化为空吗?

这样是不可以的。
记得: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; //空间大小};
}

刚刚写了无参的构造函数,接下来写一个有参的构造函数
注意点:

  1. strlen计算长度时,不包括'\0'
  2. strlen是在运行时计算的,size是编译时计算的
  3. 在初始化列表里写,它的初始化顺序是按照声明的顺序来的
    在这里插入图片描述
    之前我们说过,尽可能使用初始化列表,但是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倍的扩,但是当你知道需要多大的空间时,就可以一次性扩容好。

在这里插入图片描述

  1. reserve一般不缩容,我们需要先判断一下,想扩容的大小n是否比_capacity大
  2. 开空间的时候永远要多开一个,因为’\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迭代器五. 预留空间&#xff08;reserve)六. 尾插一个字符push_back七. 尾插一个字符串append八. operator九. operator 一. string底层逻辑 &#xff08;1&#xff09;为了和库里面…...

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可综合与不可综合语句

目录 什么是逻辑综合 可综合语句 不可综合语句 逻辑综合建模建议 综合流程 什么是逻辑综合 所谓逻辑综合就是在标准单元库和特定的设计约束的基础上&#xff0c;把设计的高层次描述转换成优化的门级网表的过程。 标准单元库&#xff08;工艺库&#xff09;可以包含简单的…...

tomcat 后台部署 war 包 getshell

1. tomcat 后台部署 war 包 getshell 首先进入该漏洞的文件目录 使用docker启动靶场环境 查看端口的开放情况 访问靶场&#xff1a;192.168.187.135:8080 访问靶机地址 http://192.168.187.135:8080/manager/html Tomcat 默认页面登录管理就在 manager/html 下&#xff0c…...

网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操解析1

文章目录 1、RAID6配置指南&#xff08;大致步骤&#xff09;2、注意事项3、截图和视频 网络云计算】2024第47周-每日【2024/11/21】周考-实操题-RAID6实操 RAID6是一种在存储系统中实现数据冗余和容错的技术&#xff0c;其最多可以容忍两块磁盘同时损坏而不造成数据丢失。RAID…...

前端面试题大汇总:React 篇

基础知识 1. 什么是 React&#xff1f;它的主要特点是什么&#xff1f; React 是一个用于构建用户界面的 JavaScript 库&#xff0c;由 Facebook 开发并维护。它主要用于构建单页应用程序&#xff08;SPA&#xff09;和复杂的用户界面。React 的主要特点包括&#xff1a; 组件…...

【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合作伙伴暨新品发布会于近日隆重举行&#xff0c;标志着AR眼镜跑步进入消费时代&#xff0c;更预示着ARAI技术融合的新篇章。智象未来&#xff08;HiDream.ai&#xff09;&#xff0c;作为多模态生成式人工智能技术的领跑者&#xff0c;与Rokid的深度合作&…...

element dialog 2层弹窗数据同步问题

注意&#xff1a;本帖为公开技术贴&#xff0c;不得用做任何商业用途 element dialog 2层弹窗数据同步问题 如果嵌套dialog&#xff0c;也就是多层dialog嵌套 2个input&#xff0c;key用同样的值 会导致内外2层dialog&#xff0c;用相同key值的input会数据同步 原因如下&a…...

向量数据库FAISS之五:原理(LSH、PQ、HNSW、IVF)

1.Locality Sensitive Hashing (LSH) 使用 Shingling MinHashing 进行查找 左侧是字典&#xff0c;右侧是 LSH。目的是把足够相似的索引放在同一个桶内。 LSH 有很多的版本&#xff0c;很灵活&#xff0c;这里先介绍第一个版本&#xff0c;也是原始版本 Shingling one-hot …...

要素市场与收入分配

生产要素与家庭收入 生产要素&#xff1a;企业用于生产产品或劳务的最初投入&#xff0c;主要分为三类&#xff1a; 劳动&#xff1a;工人的时间和技能 土地&#xff1a;代指自然资源 资本&#xff1a;指的是货币形式的资本&#xff0c;可以供企业用来购置厂房、设备等资本品…...

Web3的核心技术:区块链如何确保信息安全与共享

在互联网不断迭代的进程中&#xff0c;Web3被视为下一代互联网的核心发展方向&#xff0c;其目标是构建更加开放、安全、去中心化的数字生态。在这一过程中&#xff0c;区块链作为核心技术&#xff0c;为信息安全与共享提供了全新解决方案。本文将深入探讨区块链如何在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内置了一些函数和变量&#xff0c;全局都可以获取使用&#xff08;本文归纳非构造函数作用的…...

MySQL连接查询之自连接

自连接 相当于等值连接,只不过是自己连接自己,不像等值连接是两个不同的表之间的 案例 查询员工名和他的上司的名字 select e.last_name,m.last_name from employees e, employees m #把同一张表当成两张不同表 where e.manager_id m.employee_id;...

Python 爬虫 (1)基础 | 基础操作

一、基础操作 1、快速构建一个爬虫 ConvertCurl&#xff1a; https://curlconverter.com/选择URL&#xff0c;点击右键&#xff0c;选择 Copy >> Copy as cURL(bash) 安装JS环境&#xff1a;https://www.jb51.net/python/307069k7q.htm...

JAVA八股与代码实践----如何为springboot设置Servlet容器为jetty,jetty的优点是什么?

1、实践 排除原来的springboot-web依赖&#xff08;默认是tomcat&#xff09;&#xff0c;加入jetty的依赖 <dependencies><!-- Spring Boot Web --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-s…...

idea怎么打开两个窗口,运行两个项目

今天在开发项目的时候&#xff0c;前端希望运行一下以前的项目&#xff0c;于是就需要开两个 idea 窗口&#xff0c;运行两个项目 这里记录一下如何设置&#xff1a;首先依次点击&#xff1a; File -> Settings -> Appearance & Behavior ->System Settings 看到如…...

wend看源码-APISJON

项目地址 腾讯APIJSON官方网站 定义 APIJSON 可以定义为一个面向HTTP 协议的JSON 规范&#xff0c;一个面向数据访问层的ORM 框架。其主要工作流程包括&#xff1a;前端按照既定格式组装 JSON 请求报文&#xff0c;通过 APIJSON-ORM 将这些报文直接转换为 SQL 语句&#xff0c…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

Docker 离线安装指南

参考文章 1、确认操作系统类型及内核版本 Docker依赖于Linux内核的一些特性&#xff0c;不同版本的Docker对内核版本有不同要求。例如&#xff0c;Docker 17.06及之后的版本通常需要Linux内核3.10及以上版本&#xff0c;Docker17.09及更高版本对应Linux内核4.9.x及更高版本。…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

Robots.txt 文件

什么是robots.txt&#xff1f; robots.txt 是一个位于网站根目录下的文本文件&#xff08;如&#xff1a;https://example.com/robots.txt&#xff09;&#xff0c;它用于指导网络爬虫&#xff08;如搜索引擎的蜘蛛程序&#xff09;如何抓取该网站的内容。这个文件遵循 Robots…...

2025盘古石杯决赛【手机取证】

前言 第三届盘古石杯国际电子数据取证大赛决赛 最后一题没有解出来&#xff0c;实在找不到&#xff0c;希望有大佬教一下我。 还有就会议时间&#xff0c;我感觉不是图片时间&#xff0c;因为在电脑看到是其他时间用老会议系统开的会。 手机取证 1、分析鸿蒙手机检材&#x…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

嵌入式常见 CPU 架构

架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集&#xff0c;单周期执行&#xff1b;低功耗、CIP 独立外设&#xff1b;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel&#xff08;原始…...