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(真)结果 。