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

C++:string类(3)(string类的模拟实现)

(注:本文承接:《C++:string类(2)》)

 

一.头文件“string.h”

以上代码,使用C++对 string 类的模拟实现。依托 <string.h> 等头文件,于 yl 命名空间内定义 string 类,通过 typedef 构建迭代器,并声明 begin 、 end 等函数,逐步搭建字符顺序表的实现架构,以此开启对字符串容器手动模拟的实践,深入探寻STL容器实现的底层逻辑 。

 持续推进 string 类的模拟实现工作。构造函数、析构函数、拷贝构造函数已完成定义, size 、 c_str 等基础接口搭建完毕。同时,实现 push_back 、 append 用于字符扩展, insert 、 erase 支持灵活的内容操作,借助 find 执行查找,通过 substr 完成子串截取。逐步构建功能完善的字符串类体系,深入探究字符串类的实现细节 。

 在 yl 命名空间的 string 类模拟实现里,增添比较运算符家族(<、<=、>、>=、==、!= ),用 static const size_t npos 标记特殊位置,私有成员封装 _size   _capacity   _str  管控资源,还外接 operator<<  支持流输出,逐步完善字符串类的功能拼图,向完整模拟标准 string 靠近 。

 

二.源文件“string.cpp”

在 yl 命名空间的 string 类实现中,迭代器接口( begin / end  含const版)搭建完毕,通过指针操作定位字符串首尾。构造函数则依据传入C风格字符串,初始化 _size   _capacity ,动态开辟内存并拷贝内容,一步步夯实自定义 string 类的基础实现 。

 

 以上代码聚焦于  string  类核心功能的实现完善。析构函数有序释放动态分配的字符数组资源,重置对象状态;拷贝构造函数通过深拷贝,准确复制源对象的字符串内容、大小与容量,保障对象独立; size  与  c_str  接口,分别用于获取字符串长度和原始字符指针,为外部使用提供基础支持 ,逐步构建健壮的自定义字符串类体系。

 以上这代码接着搞  string  类的核心功能啦。 []  运算符重载搞了两个版本,普通版和  const  版,用断言确保下标没越界,能直接读写字符。还有  reverse  函数,负责给字符串扩容,新申请内存、把旧数据拷过去、更新指针和容量,一步步把自定义  string  的底层逻辑给夯实,模拟字符串类的进度又往前推了 。

 继续填充 string 类功能~ push_back 负责单个字符追加,先检查容量,不够就按规则扩容(空的话开4,否则翻倍),然后把字符塞进去并更新长度和结束符。 append 处理字符串追加,流程类似,靠 memcpy 批量拷贝。 operator+= 直接复用 push_back ,简洁又高效,一步步让自定义字符串类更实用 。

 接着给 string 类加新功能。operator+= 复用 append ,简洁处理字符串拼接。 insert 函数先断言位置合法,容量不够就扩容(空给4,否则翻倍)。然后通过后移字符腾出位置,插入新字符、更新长度,让字符串支持中间插入操作,功能越来越全面 。

在  string  类实现里, insert  函数支持在指定位置插入字符串啦。先断言位置合法,容量不够就按规则扩容,算出插入字符串长度后,通过后移字符腾出空间,再逐个拷贝字符进去,更新字符串长度,让自定义  string  类的拼接操作更灵活。

 这段代码完善 string 类的删除功能。 erase 可按位置和长度删字符,灵活处理不同情况; pop_back 专删末尾字符,先断言非空,再调整长度和结束符。这些操作让自定义字符串类的内容管理更自如,逐步贴近实用的字符串工具。

 这段代码给 string 类加上查找功能啦。字符查找用循环遍历,从指定位置往后找目标字符;子串查找借助 strstr 函数,定位到就返回起始下标,找不到就给 npos 。有了这俩 find ,字符串里找东西更方便,自定义 string 类又变强了。

 实现  substr  函数,处理两种长度情况,先确定要截取的有效长度,创建新  string  对象,扩容后逐个字符拷贝,把原字符串指定位置和长度的子串提取出来返回,让自定义  string  类具备了截取子串的能力 。

 以上这段代码是 C++ 中自定义  string  类的比较运算符实现,包含:

  operator< :逐字符按字典序比较,字符小则返回  true ,大则  false ,字符相同继续,遍历完后根据索引判断。

  operator<= :复用  <  和  == (需  ==  运算符已实现 ),满足小于或等于时返回  true 。

 operator> :复用  <= ,返回其取反结果,即不满足小于等于时为  true ,实现大于比较逻辑。

 

 给 string  类补全比较运算符。 operator<  逐字符对比,按字典序判断大小; operator<=  复用 <  和 ==  ; operator>  又靠 <=  实现,用复用的方式把字符串比较功能高效搭起来,让自定义 string  类能像标准库那样比大小

 

三.测试文件test.cpp

这段 C++ 代码,在  test01  函数里:用自定义  string  类(非标准库  std::string  ,因标准库无  begin  等接口需自定义实现)创建  s1  存  "hello world"  ;获取迭代器  it  遍历;通过  c_str  输出 C 风格字符串, size  输出长度,循环用迭代器逐个输出字符 。调试窗口显示结果。

 以上 C++ 代码, test02  函数里:创建自定义  string  对象  s2  存  "hello world" ;用下标循环、范围  for  循环遍历输出字符;调用  reserve(20)  尝试扩容,最后输出容量。右侧是程序运行输出,包含字符遍历结果和扩容后的容量值 。

 以上代码定义了  test03  函数,操作自定义  string  类对象  s3 :先初始化内容为  "hello world" ,调用  reserve(15)  预留空间,接着通过  push_back  追加字符  'x' 、 append  追加  "***" 、 +=  追加  "666" ,最后输出  s3  内容。右侧显示输出结果  hello worldxxx***666  。

 这段代码是 C++ 中对自定义  string  类的操作,在  test04  函数里:创建  s4  初始为  "hello world" ,先  reserve(15)  预留空间,接着  insert  插入字符和字符串,多次  cout  输出,还有  pop_back  删除末尾字符、 erase  删除指定位置内容 。右侧是输出结果,能看到操作后字符串的变化。

 以上C++代码实现了一个  split_url  函数,用于解析 URL 。在  main  函数中,创建了自定义  string  类( yl::string  )的对象  url1  并传入  split_url  函数 。通过  find  和  substr  方法,提取 URL 的协议(如  http  )、域名(如  legacy.cplusplus.com  )、路径(如  reference/string/string/  ),控制台输出了解析后的三部分内容 。

 这段代码是 C++ 中对自定义  string  类( yl::string  )的比较测试。 test05  函数里创建  s5 ( "hellox world"  )和  s6 ( "hello world"  ),用  == 、 <= 、 >= 、 < 、 > 、 !=  运算符比较,输出布尔结果。右侧控制台显示比较后的 0(假)和 1(真)结果 。

http://www.dtcms.com/a/269050.html

相关文章:

  • 批量OCR的GitHub项目
  • Linux 进程控制:全面深入剖析进程创建、终止、替换与等待
  • UI自动化常见面试题
  • qt-C++笔记之QSplitter
  • PyTorch笔记3----------统计学相关函数
  • AI PPT探秘
  • ARMv7单核CPU上SWI(软件中断)验证
  • 策略与工厂的演进:打造工业级Spring路由框架
  • window显示驱动开发—X 通道解释
  • 如何远程管理Linux服务器
  • Rust 内存结构:深入解析
  • DPDK 网络驱动 之 UIO
  • 如何使用 Renode(快速入门)
  • 二进制安全-汇编语言-03-寄存器(内存访问)
  • cuda编程笔记(6)--流
  • PowerQuery逆透视之二维表转一维表
  • 50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | ContentPlaceholder(背景占位)
  • 电动汽车的传导发射仿真
  • navicate如何设置数据库引擎
  • RabbitMQ在SpringBoot中的使用详解
  • 2025光学成像与机器视觉国际会议 (OIMV 2025)
  • 用Python制作华夫图:从零开始
  • ShortGPT: Layers in Large Language Models are More Redundant Than You Expect
  • delphi,c++程序 阻止Win11 用户更改系统时间
  • 电子防抖(EIS)技术概述
  • Springboot 如何加密数据库连接相关配置信息
  • 特伦斯T1节拍器,突出综合优势与用户体验
  • AI建站工具对决:Wegic、腾讯云、Hocoos、Typedream深度测评,谁是国内用户的首选?
  • MySQL Galera Cluster企业级部署
  • 【Python】VSCode:解决模块导入与调试