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

手写C++ string类实现详解

类定义

cpp

namespace ym {class string {private:char* _str;        // 字符串数据size_t _size;      // 当前字符串长度size_t _capacity;  // 当前分配的内存容量static const size_t npos = -1;  // 特殊值,表示最大可能位置public:// 构造函数和析构函数string(const char* str = "");string(const string& s);~string();// 迭代器支持typedef char* iterator;typedef const char* const_iterator;iterator begin();iterator end();// ... 其他成员函数};
}

核心功能实现

1. 内存管理

reserve() 函数

cpp

void string::reserve(size_t n) {if (n > _capacity) {char* str = new char[n + 1];  // 多分配1字节存放'\0'strcpy(str, _str);delete[] _str;_str = str;_capacity = n;}
}
push_back() 函数

cpp

void string::push_back(char ch) {if (_size == _capacity) {reserve(_capacity == 0 ? 4 : 2 * _capacity);  // 初始容量为4,之后每次翻倍}_str[_size++] = ch;_str[_size] = '\0';  // 确保字符串始终以'\0'结尾
}

2. 字符串操作

append() 函数

cpp

void string::append(const char* str) {size_t len = strlen(str);if (_size + len > _capacity) {reserve(max(_size + len, 2 * _capacity));  // 按需扩容}strcat(_str + _size, str);  // 追加字符串_size += len;
}
insert() 函数

cpp

void string::insert(size_t pos, const char* str) {assert(pos <= _size);size_t len = strlen(str);if (_size + len > _capacity) {reserve(_size + len);}// 向后移动字符memmove(_str + pos + len, _str + pos, _size - pos + 1);  // +1包含'\0'// 插入新内容memcpy(_str + pos, str, len);_size += len;
}

3. 运算符重载

赋值运算符

cpp

string& string::operator=(string s) {if (this != &s) {  // 防止自赋值delete[] _str;_str = new char[s._capacity + 1];strcpy(_str, s._str);_size = s._size;_capacity = s._capacity;}return *this;
}
比较运算符

cpp

bool operator<(const string& s1, const string& s2) {return strcmp(s1.c_str(), s2.c_str()) < 0;
}
// 其他比较运算符类似...

4. 流操作符

输出运算符

cpp

ostream& operator<<(ostream& out, const string& s) {for (auto ch : s) {  // 使用范围for循环out << ch;}return out;
}
输入运算符(优化版)

cpp

istream& operator>>(istream& in, string& s) {s.clear();const int N = 256;  // 缓冲区大小char buff[N];int i = 0;char ch;// 跳过前导空白while (in.get(ch) && isspace(ch)) {}// 读取直到遇到空白if (!in.eof()) {do {buff[i++] = ch;if (i == N - 1) {  // 缓冲区快满时buff[i] = '\0';s += buff;i = 0;}} while (in.get(ch) && !isspace(ch));// 处理剩余字符if (i > 0) {buff[i] = '\0';s += buff;}}return in;
}

关键设计点

  1. 内存管理

    • 使用new[]delete[]手动管理内存

    • 采用指数级扩容策略(初始4,之后每次翻倍)

    • 始终确保字符串以'\0'结尾

  2. 异常安全

    • 赋值运算符使用拷贝交换惯用法

    • 关键操作前进行断言检查

  3. 性能优化

    • 输入操作符使用缓冲区减少扩容次数

    • 使用memmovememcpy提高大块数据操作效率

  4. 标准兼容

    • 提供迭代器支持

    • 实现完整的比较运算符

    • 支持流操作符

使用示例

cpp

ym::string s1 = "Hello";
ym::string s2 = "World";s1 += " ";
s1 += s2;  // s1变为"Hello World"cout << s1 << endl;  // 输出: Hello Worldym::string s3;
cin >> s3;  // 读取输入
http://www.dtcms.com/a/339028.html

相关文章:

  • React 新拟态登录页面使用教程
  • 星图云开发者平台新功能速递 | 微服务管理器:无缝整合异构服务,释放云原生开发潜能
  • C++入门自学Day14-- Stack和Queue的自实现(适配器)
  • [Android] 显示的内容被导航栏这挡住
  • STM32 定时器(输出模式)
  • 开源游戏引擎Bevy 和 Godot
  • 开源AI工具Midscene.js
  • 第9章 React与TypeScript
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(17):文法+单词第5回3-复习
  • 指针的应用学习日记
  • GraphQL 与 REST 在微服务架构中的对比与设计实践
  • RadioIrqProcess函数详细分析与流程图
  • C#语言的语法(数据类型)
  • 清空 github 仓库的历史提交记录(创建新分支)
  • 神经网络中的那些关键设计:从输入输出到参数更新
  • STranslate:一键聚合翻译+OCR,效率翻倍
  • 云端赋能,智慧运维:分布式光伏电站一体化监控平台研究
  • 卫生许可证识别技术:通过OCR与NLP实现高效合规管理,提升审核准确性与效率
  • Git#revert
  • 如何解析PDF中的复杂表格数据
  • 星链之供应链:SpaceX供应链韧性密码,70%内部制造+模块化设计,传统航天企业如何追赶?
  • 四大常用排序算法
  • 【线性基】P4301 [CQOI2013] 新Nim游戏|省选-
  • Voice Agents:下一代语音交互智能体的架构革命与产业落地
  • 大语言模型中的归一化实现解析
  • elasticsearch8.12.0安装分词
  • 【Spring Boot把日志记录到文件里面】
  • 郑州续面事件的技术视角:网络传播机制与舆情应对技术方案
  • Git+Jenkins实战(一)
  • Windows系统维护,核心要点与解决方案