网站开发人员的工资手机网站网络环境

张小明 2025/12/24 10:53:51
网站开发人员的工资,手机网站网络环境,怎么做企业推广,遵义市住房和城乡建设局官方网站目录 一、概述与设计理念 二、核心数据结构 2.1 类的成员变量 2.2 迭代器实现 三、构造函数与析构函数 3.1 默认构造函数 3.2 C 字符串构造函数 3.3 注释中的合并构造函数 3.4 拷贝构造函数#xff08;现代写法#xff09; 3.5 析构函数 四、赋值运算符与资源管理…目录一、概述与设计理念二、核心数据结构2.1 类的成员变量2.2 迭代器实现三、构造函数与析构函数3.1 默认构造函数3.2 C 字符串构造函数3.3 注释中的合并构造函数3.4 拷贝构造函数现代写法3.5 析构函数四、赋值运算符与资源管理4.1 现代写法的赋值运算符4.2 swap 成员函数4.3 注释中的传统赋值实现五、容量管理与扩容策略5.1 reserve 函数5.2 push_back 的扩容策略5.3 append 的智能扩容六、插入操作与边界处理6.1 插入单个字符6.2 插入字符串的复杂情况6.3 注释中的问题代码七、删除操作实现7.1 erase 函数7.2 注释中的替代实现八、查找与子串操作8.1 查找字符8.2 查找子串8.3 获取子串九、比较运算符实现9.1 基本比较运算符9.2 运算符复用策略9.3 相等性判断十、流操作符实现10.1 输出运算符10.2 输入运算符优化前10.3 输入运算符优化后10.4 getline 函数十一、测试代码分析11.1 test_string1基础功能测试11.2 test_string2插入功能测试11.3 test_string3删除功能测试11.4 test_string4拷贝和子串测试11.5 test_string5比较和流操作测试11.6 test_string6getline 测试11.7 test_string7 和 test_string8深拷贝和交换测试十二、静态成员的特殊性12.1 npos 的定义12.2 静态常量初始化规则十三、设计总结与优化建议13.1 设计亮点13.2 潜在改进一、概述与设计理念这是一个完全从头实现的 C string 类位于yyq命名空间下避免了与标准库std::string的命名冲突。该实现涵盖了字符串处理的核心功能包括动态内存管理、深拷贝、迭代器支持、运算符重载和流操作等。二、核心数据结构2.1 类的成员变量cppprivate: char* _str nullptr; // 指向动态分配的字符数组 size_t _size 0; // 当前字符串长度不包含结尾的\0 size_t _capacity 0; // 当前分配的容量 static const size_t npos; // 特殊值表示未找到设计分析使用动态分配的字符数组存储字符串内容_size表示实际字符数_capacity表示分配的容量npos是静态常量模仿标准库设计表示查找失败的特殊值2.2 迭代器实现cpppublic: typedef char* iterator; typedef const char* const_iterator; iterator begin() { return _str; } iterator end() { return _str _size; } const_iterator begin() const { return _str; } const_iterator end() const { return _str _size; }关键点由于字符串在内存中连续存储原生指针可以直接作为迭代器提供const和非const两个版本支持常量和非常量迭代实现了begin()和end()方法支持范围 for 循环三、构造函数与析构函数3.1 默认构造函数cppstring() :_str(new char[1] {\0}) ,_size(0) ,_capacity(0) {}实现细节分配 1 字节内存初始化为\0_size和_capacity都设为 0注意虽然_capacity为 0但实际分配了 1 字节内存这可能导致概念上的混淆3.2 C 字符串构造函数cppstring(const char* str) { _size strlen(str); _capacity _size; _str new char[_capacity 1]; strcpy(_str, str); }设计选择这是单参数构造函数支持隐式类型转换精确分配所需内存没有预留额外空间使用strcpy复制字符串包括结尾的\03.3 注释中的合并构造函数cpp//string(const char* str ) //{ // _size strlen(str); // _capacity _size; // _str new char[_capacity 1]; // strcpy(_str, str); //}为什么没有采用将默认构造函数和 C 字符串构造函数合并为一个使用空字符串作为默认参数虽然代码更简洁但可能降低可读性作者选择分开实现3.4 拷贝构造函数现代写法cppstring(const string s) { string temp(s._str); swap(temp); }实现原理先通过 C 字符串构造函数创建临时对象temp然后与当前对象交换资源临时对象在函数结束时析构释放原资源对比传统写法cpp// 传统写法 string(const string s) { _str new char[s._capacity 1]; strcpy(_str, s._str); _size s._size; _capacity s._capacity; }现代写法的优势代码更简洁利用已有构造函数减少重复代码通过swap实现异常安全3.5 析构函数cpp~string() { if (_str) { delete[] _str; _str nullptr; _size _capacity 0; } }安全考虑检查_str是否为nullptr避免对空指针调用delete[]释放后将指针置空防止悬空指针重置_size和_capacity确保对象状态一致四、赋值运算符与资源管理4.1 现代写法的赋值运算符cppstring operator(string temp) { swap(temp); return *this; }工作原理参数temp通过值传递会调用拷贝构造函数创建副本交换当前对象与副本的资源副本在函数结束时析构释放原对象的资源优势分析自动处理自赋值情况s s代码简洁利用拷贝构造函数和swap异常安全如果拷贝构造失败原对象状态不变4.2 swap 成员函数cppvoid swap(string s) { std::swap(_str, s._str); std::swap(_size, s._size); std::swap(_capacity, s._capacity); }实现细节使用std::swap交换三个成员变量std::swap对于内置类型是高效的这个函数是拷贝和赋值操作的核心4.3 注释中的传统赋值实现cpp//string operator(const 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; //}传统写法的问题需要显式检查自赋值如果new失败抛出异常原对象的内存已被释放对象处于无效状态代码较冗长五、容量管理与扩容策略5.1 reserve 函数cppvoid string::reserve(size_t n) { if (n _capacity) { char* temp new char[n 1]; // 1 给 \0 预留空间 strcpy(temp, _str); delete[] _str; _str temp; _capacity n; } }特点只扩大容量不缩小使用strcpy复制原字符串包括\0新容量为n实际分配n1字节5.2 push_back 的扩容策略cppvoid string::push_back(char ch) { if (_size _capacity) { reserve(_capacity 0 ? 4 : _capacity * 2); } _str[_size] ch; _size; _str[_size] \0; }扩容规则初始容量为 0 时扩容到 4后续每次容量不足时容量翻倍这种指数级扩容策略均摊时间复杂度为 O(1)5.3 append 的智能扩容cppvoid string::append(const char* str) { size_t len strlen(str); if (_size len _capacity) { // 需要的大小超过2倍容量时按需扩容否则按2倍扩 reserve(len _size 2 * _capacity ? len _size : 2 * _capacity); } strcpy(_str _size, str); _size len; }智能策略如果要添加的内容很大超过当前容量的 2 倍按实际需要扩容否则按 2 倍扩容平衡了内存使用和扩容次数六、插入操作与边界处理6.1 插入单个字符cppvoid string::insert(size_t pos, char ch) { assert(pos _size); if (_size _capacity) { reserve(_capacity 0 ? 4 : _capacity * 2); } size_t end _size 1; while (end pos) { _str[end] _str[end - 1]; --end; } _str[pos] ch; _size; }边界处理使用assert(pos _size)确保位置合法如果pos _size相当于在末尾插入从后向前移动字符避免覆盖未移动的数据6.2 插入字符串的复杂情况cppvoid string::insert(size_t pos, const char* str) { assert(pos _size); size_t len strlen(str); if (_size len _capacity) { reserve(len _size 2 * _capacity ? len _size : 2 * _capacity); } size_t end _size len; while (end len pos - 1) { _str[end] _str[end - len]; --end; } for (size_t i 0; i len; i) { _str[pos i] str[i]; } _size len; }关键技巧循环条件while (end len pos - 1)避免了pos-1在pos0时下溢先移动原字符串内容再插入新字符串处理了空字符串的情况虽然注释中检查len0的代码被注释掉了6.3 注释中的问题代码cpp// 方法一有问题的实现 //int end _size; //while (end (int)pos) //{ // _str[end 1] _str[end]; // --end; //}问题分析end是int类型pos是size_t类型比较时int会被提升为无符号类型当pos0end-1时-1被提升为很大的无符号数循环条件不满足七、删除操作实现7.1 erase 函数cppvoid string::erase(size_t pos, size_t len) { assert(pos _size); if (len _size - pos) { _str[pos] \0; _size pos; return; } size_t end pos len; while (end _size) { _str[end - len] _str[end]; end; } _size - len; }两种情况的处理删除到末尾直接截断字符串删除中间部分向前移动后续字符注意循环条件end _size确保拷贝结尾的\0使用assert(pos _size)不允许在pos _size处删除7.2 注释中的替代实现cpp//if (len _size - pos) //{ // _str[pos] \0; // _size pos; //} //else //{ // for (size_t i pos len; i _size; i) // { // _str[i - len] _str[i]; // } // _size - len; //}对比分析逻辑基本相同只是结构略有差异当前实现提前返回可能更清晰for循环版本更紧凑八、查找与子串操作8.1 查找字符cppsize_t string::find(char ch, size_t pos) { assert(pos _size); for (size_t i pos; i _size; i) { if (_str[i] ch) { return i; } } return npos; }简单实现线性查找时间复杂度 O(n)使用assert(pos _size)确保起始位置有效找不到时返回npos8.2 查找子串cppsize_t string::find(const char* str, size_t pos) { assert(pos _size); const char* ptr strstr(_str pos, str); if (ptr nullptr) { return npos; } else { return ptr - _str; } }利用标准库使用 C 标准库的strstr函数ptr - _str计算偏移量指针算术注意需要确保_str以\0结尾8.3 获取子串cppstring string::substr(size_t pos, size_t len) { assert(pos _size); if (len _size - pos) { len _size - pos; } string str; str.reserve(len); for (size_t i 0; i len; i) { str _str[pos i]; } return str; }实现细节调整len确保不超过字符串边界先reserve预留空间减少扩容次数逐个字符添加确保正确性传值返回可能触发拷贝构造编译器可能优化九、比较运算符实现9.1 基本比较运算符cppbool operator (const string s1, const string s2) { return strcmp(s1.c_str(), s2.c_str()) 0; }为什么是全局函数全局函数支持隐式类型转换hello s和s hello都有效不能直接访问私有成员必须使用c_str()公共接口9.2 运算符复用策略cppbool operator (const string s1, const string s2) { return s1 s2 || s1 s2; } bool operator (const string s1, const string s2) { return !(s1 s2); }设计理念只实现operator和operator其他运算符通过这两个复用修改比较逻辑时只需改两个地方9.3 相等性判断cppbool operator (const string s1, const string s2) { return strcmp(s1.c_str(), s2.c_str()) 0; } bool operator ! (const string s1, const string s2) { return !(s1 s2); }注意hello world hello world比较的是指针地址不是字符串内容只有当const char*隐式转换为string时才会调用重载的operator十、流操作符实现10.1 输出运算符cppostream operator(ostream out, const string s) { for (auto ch : s) { out ch; } return out; }简洁实现使用范围 for 循环遍历字符串逐个字符输出到流返回流引用以支持链式调用10.2 输入运算符优化前cpp// 原始版本频繁扩容 //istream operator(istream in, string s) //{ // s.clear(); // char ch; // ch in.get(); // while (ch ! ch ! \n) // { // s ch; // ch in.get(); // } // return in; //}问题每次读取一个字符就追加可能频繁扩容性能较差特别是读取长字符串时10.3 输入运算符优化后cppistream operator(istream in, string s) { s.clear(); const int N 256; char buff[N]; int i 0; char ch in.get(); while (ch ! ch ! \n) { buff[i] ch; if (i N - 1) { buff[i] \0; s buff; i 0; } ch in.get(); } if (i 0) { buff[i] \0; s buff; } return in; }优化策略使用 256 字节缓冲区暂存输入缓冲区快满时批量追加到字符串大大减少扩容次数提高性能10.4 getline 函数cppistream getline(istream in, string s) { s.clear(); const int N 256; char buff[N]; int i 0; char ch in.get(); while (ch ! \n) { buff[i] ch; if (i N - 1) { buff[i] \0; s buff; i 0; } ch in.get(); } if (i 0) { buff[i] \0; s buff; } return in; }与operator的区别只以换行符\n为分隔符可以读取包含空格的整行输入实现逻辑与operator类似十一、测试代码分析11.1 test_string1基础功能测试测试构造函数、下标访问、迭代器和范围 for 循环。11.2 test_string2插入功能测试测试运算符和insert函数的各种情况。11.3 test_string3删除功能测试测试erase函数的边界情况包括删除到末尾和删除部分字符。11.4 test_string4拷贝和子串测试测试拷贝构造、赋值运算符、子串提取和自赋值。11.5 test_string5比较和流操作测试测试比较运算符、输入输出运算符和隐式类型转换。11.6 test_string6getline 测试测试整行输入功能。11.7 test_string7 和 test_string8深拷贝和交换测试测试深拷贝的正确性和swap功能。十二、静态成员的特殊性12.1 npos 的定义cppconst size_t string::npos -1;类型转换-1赋给无符号size_t会变成最大可能值这是模拟标准库std::string::npos的行为12.2 静态常量初始化规则cpp// 在类内static const size_t npos; // 在类外const size_t string::npos -1;C 规则静态成员需要在类外单独定义和初始化只有静态整型常量可以在类内初始化特殊情况例如static const int N 10;可以在类内初始化十三、设计总结与优化建议13.1 设计亮点RAII 原则构造函数获取资源析构函数释放资源深拷贝实现正确处理拷贝和赋值现代 C 技巧使用swap实现拷贝控制和异常安全智能扩容策略平衡内存使用和性能完整迭代器支持兼容 STL 算法和范围 for 循环13.2 潜在改进小字符串优化对于短字符串使用栈存储避免堆分配移动语义添加移动构造函数和移动赋值运算符异常安全增强某些操作可能不是强异常安全的性能优化substr可以一次性拷贝而不是逐个字符添加Unicode 支持当前只支持单字节字符这个实现作为教学项目完整展示了 string 类的核心原理对于理解 C 的类设计、内存管理和运算符重载有重要价值。
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

公司建站系统html文件编辑器

Markdown浏览器插件:解锁专业文档阅读体验的终极指南 【免费下载链接】markdown-viewer Markdown Viewer / Browser Extension 项目地址: https://gitcode.com/gh_mirrors/ma/markdown-viewer 还在为技术文档的可读性而烦恼吗?传统的Markdown文件…

张小明 2025/12/24 10:53:51 网站建设

网站建设是前端后端吗做网站全程指导

SPS10X300-K0E7 控制器模块类型:工业控制器模块功能概述:核心用于工业自动化系统的逻辑控制与数据处理接收输入信号、执行程序逻辑,并输出控制信号到执行器可实现实时监控、数据采集、通讯及设备协调控制技术特点:高速处理能力&am…

张小明 2025/12/24 10:51:49 网站建设

企业网站备案注销口碑营销的案例及分析

维护网络游戏服务器是确保游戏稳定运行、为玩家提供良好体验的关键,需要定期清理服务器内部灰尘,灰尘积累过多可能会影响硬件散热,进而导致硬件性能下降甚至损坏,使用专业的清洁工具,如压缩空气罐、防静电毛刷等&#…

张小明 2025/12/24 10:49:48 网站建设

网站制作与建立站长工具介绍

League Akari:解放双手的智能英雄联盟游戏利器 【免费下载链接】LeagueAkari ✨兴趣使然的,功能全面的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/LeagueAkari 在英雄联盟的激烈…

张小明 2025/12/24 10:47:46 网站建设

营销型网站的标准重庆大渡口建设网站

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

张小明 2025/12/24 10:45:45 网站建设

杭州网站建设交易网络营销与直播电商专业就业方向

Gittyup:告别命令行,可视化Git历史管理的终极方案 【免费下载链接】Gittyup Understand your Git history! 项目地址: https://gitcode.com/gh_mirrors/gi/Gittyup 还在为复杂的Git命令头疼吗?还在纠结如何清晰理解代码提交历史&#…

张小明 2025/12/24 10:43:44 网站建设