2026/2/9 23:48:53
网站建设
项目流程
怎么给公司网站上放视频,如何用微信打开微网站,做外贸生意上哪个网站,跨境电商网站开发技术1. 为什么要学习string类#xff1f; 在 C 语言里#xff0c;字符串被定义为#xff1a; 以字符’\0’作为结尾标志的一组字符集合。 这种定义方式使得字符串在存储和识别上有了明确的界定。 为了让开发者能更便捷地对字符串进行诸如#xff1a;复制、拼接、比较等操作在 C 语言里字符串被定义为以字符’\0’作为结尾标志的一组字符集合。这种定义方式使得字符串在存储和识别上有了明确的界定。 为了让开发者能更便捷地对字符串进行诸如复制、拼接、比较等操作C 标准库精心提供了一系列以str开头的库函数例如strcpy字符串复制函数strcat字符串拼接函数strcmp字符串比较函数……然而这些库函数存在一定的局限性它们与字符串本身在逻辑上是相互分离的。从面向对象编程OOP的理念来看OOP 强调将数据和操作数据的方法封装在一起形成一个有机的整体这样可以让代码的结构更加清晰可维护性更强。但 C 标准库中的str系列库函数并非如此它们独立于字符串对象之外不太契合 OOP 这种将数据与操作紧密结合的思想。不仅如此在使用这些库函数操作字符串时底层的内存空间管理责任完全落在了用户身上。用户需要自行负责分配足够的空间来存储字符串以及确保在对字符串进行操作时不会超出所分配空间的边界。这就要求开发者在编写代码时格外小心谨慎稍有疏忽比如在复制字符串时没有正确计算目标空间的大小就极有可能导致越界访问的问题进而引发程序崩溃、数据损坏等严重后果。基于上述种种原因我们会发现 C 语言中字符串操作存在一些不便之处而 C 的string 类能够很好地解决这些问题string类将字符串数据及其相关操作封装在一起完美契合面向对象编程OOP的思想使得代码结构更加清晰、易于维护。string类内部会自动管理底层的内存空间无需开发者手动操心内存分配与释放的细节极大地降低了因内存管理不当导致越界访问等错误的风险。2. 标准库中的string类是什么样的呢cplusplus网站上关于C的string类的介绍 C Reference在这里插入图片描述在这里插入图片描述在这里插入图片描述标准库中的string类相关知识主要可分为以下三大部分1. 成员函数迭代器相关用于获取指向string类内部字符的迭代器。例如方便对字符串进行遍历、查找等操作容器特性相关实现类似容器的功能。例如获取字符串长度、判断是否为空等元素访问提供接口用于直接访问字符串中的字符。例如通过下标访问特定位置的字符修改操作用于改变字符串的内容。例如插入、删除、替换字符或子串等字符串操作比较字符串等操作。例如字符串的拼接、查找子串2. 非成员函数重载对一些常见运算符如用于字符串拼接等 以及输入输出流运算符、进行重载。以支持与string类对象的自然交互。3. 成员常量string类中定义的一些具有固定值的常量可能用于表示特定的属性或边界条件等。在这里插入图片描述3. string类在MSVC和g编译器下有什么区别3.1结构上不同注意下述结构是在 32 位平台下验证的在 32 位平台中指针占 4 个字节在 MSVCMicrosoft Visual C环境下string的结构相对复杂总共占用28 个字节其内部包含一个联合体该联合体用于定义string中字符串的存储空间。代码语言javascriptAI代码解释//联合体的定义如下 union _Bxty { // 用于存放小缓冲区或指向更大缓冲区的指针 value_type _Buf[_BUF_SIZE]; pointer _Ptr; char _Alias[_BUF_SIZE]; // 用于允许别名 } _Bx;当字符串长度 16 时使用内部固定的字符数组来存放字符串。当字符串长度 16 时则从堆上开辟空间来存储。这种设计是有道理的在大多数情况下字符串长度小于 16 。 此时string对象创建后内部已具备 16 个字符数组的固定空间无需从堆上动态创建提高了效率。此外string结构中还有一个size_t类型字段用于保存字符串的实际长度。另一个size_t类型字段用来保存从堆上开辟空间的总容量。最后还有一个指针用于其他相关操作。因此string的总字节数为 16联合体中字符数组的大小 4保存长度的size_t字段 4保存容量的size_t字段 4指针大小 28 个字节。在 g GNU C环境下string采用写时拷贝机制实现。string对象本身仅占4个字节内部仅有一个指针该指针指向一块位于堆上的空间。这块堆空间包含以下字段字符串有效长度空间总容量引用计数代码语言javascriptAI代码解释struct _Rep_base { size_type _M_length; //字符串有效长度 size_type _M_capacity; //空间总容量 _Atomic_word _M_refcount; //引用计数 };3.2扩容规则不同MSVCMicrosoft Visual C的扩容规则扩容因子通常为1.5 倍非固定值可能随版本调整行为特点相对保守的内存增长减少内存浪费代码语言javascriptAI代码解释int main() { // reverse 反转 逆置 // reserve 保留、预留 //1.使用标准库中的string类实例化一个对象 string s; //2.使用标准库中的string类封装的成员函数reserve提前开空间避免扩容提高效率 //s.reserve(100); //3.使用标准库中的string类封装的成员函数capacity获取当前的字符串的总容量 size_t sz s.capacity(); cout capacity changed: sz \n; cout making s grow:\n; for (int i 0; i 100; i) { //3.使用标准库中的string类封装的成员函数push_back向字符串的尾部添加字符目的观察一下MSVC环境下的string的扩容规则 s.push_back(c); if (sz ! s.capacity()) { sz s.capacity(); cout capacity changed: sz \n; } } return 0; }在这里插入图片描述g GNU C的扩容规则扩容因子通常为2 倍早期版本常见行为特点更激进的内存增长减少频繁扩容的开销-------------标准接口--------------------------成员函数-----------1.常见构造下面我们直接来看标准库中关于string类构造函数的介绍早期 C 设计者为string类设计了多达 9 个构造函数目前我们先集中学习以下红色方框中的 4 个。 暂未学习其他构造函数主要有两点原因部分构造函数实际应用场景较少现阶段学习性价比不高可暂不关注部分构造函数涉及较复杂的知识如模板进阶等对当前学习进度而言难度较大适合后续阶段深入学习构造函数名称功能说明string()构造一个空的 string 类对象即空字符串string(const char* s)用 C 风格字符串C-string构造 string 类对象string(size_t n, char c)构造包含 n 个相同字符 c 的 string 类对象string(const string s)拷贝构造函数用于复制另一个 string 对象在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; void Teststring() { // 使用string()构造空的string类对象s1 cout 使用string()构造函数 endl; string s1; cout s1: s1 endl; // 使用string(const char* s)用C-string来构造string类对象s2 cout 使用string(const char* s)构造函数 endl; string s2(hello world); cout s2: s2 endl; // 使用string(size_t n, char c)构造包含n个字符c的string类对象s3 cout 使用string(size_t n, char c)构造函数 endl; string s3(5, a); cout s3: s3 endl; // 使用string(const string s)拷贝构造函数构造s4以s2为蓝本 cout 使用string(const string s)拷贝构造函数 endl; string s4(s2); cout s4: s4 endl; } int main() { Teststring(); return 0; }在这里插入图片描述2.容量操作注和上面一样这里我们还是只是挑选几个常用的进行介绍在这里插入图片描述函数名称功能说明备注size()返回字符串中有效字符的长度不包含结尾的 \0与 length() 功能完全相同推荐使用 size() 保持容器一致性length()返回字符串中有效字符的长度历史遗留接口行为与 size() 一致通常用于字符串操作的可读性capacity()返回当前字符串分配的总空间大小单位字节总空间 ≥ 有效字符长度size()empty()检查字符串是否为空即size() 0空则返回 true否则返回 false比手动检查 size() 0 更直观高效clear()清空字符串中的所有有效字符size() 变为 0但不释放内存空间清空后 capacity() 保持不变适合复用对象避免重复分配内存reserve(n)预分配至少容纳 n 个字符的内存空间可能扩容仅影响容量不改变内容或长度若 n capacity()可能无操作resize(n, c)调整有效字符数量为 n 个多出的空间用字符 c 填充若 n size() 则截断默认填充 \0若未指定 c可能触发扩容若n capacity()std::string::size在这里插入图片描述std::string::length在这里插入图片描述std::string::capacity在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { string str(Test string); cout size: str.size() \n; cout length: str.length() \n; cout capacity: str.capacity() \n; return 0; }在这里插入图片描述std::string::empty在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { //1.用于临时存储每一行输入的文本 string line; //2.用于存储用户输入的完整文本内容 string content; cout 请输入一段文本输入空行以结束\n; //3.循环读取用户输入的每一行直到遇到空行为止 do { //3.1从标准输入读取一行文本包括空格存入 line 中 getline(cin, line); //注意getline 会读取到换行符为止但不会将换行符存入 line //3.2将当前行追加到 content 中并手动添加换行符因为 getline 不保留换行符 content line \n; } while (!line.empty()); //循环条件只要当前行不为空!line.empty()就继续循环 //4.输出用户输入的完整文本包含所有行包括最后的空行 cout 您输入的文本是\n content; return 0; }在这里插入图片描述std::string::clear在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { //1.用于存储从输入流读取的单个字符 char c; //2.用于拼接读取到的字符形成一行文本 string str; cout 请输入几行文本以(.)作为结束标志\n; //3.循环读取字符直到读取到 . 时结束循环 do { //3.1从标准输入流读取一个字符包括空格、换行符等 c cin.get(); //3.2将读取到的字符追加到字符串str的末尾 str c; //3.3当读取到换行符 \n 时表示一行输入结束 if (c \n) { cout str; // 输出当前拼接好的一行文本包含换行符 str.clear(); // 清空字符串str准备接收下一行的输入 } } while (c ! .); //4.输出读取到的文本内容 cout str endl; return 0; }在这里插入图片描述std::string::reserve在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { /*--------------------创建一个包含长字符串的string对象--------------------*/ cout 创建一个包含长字符串的string对象 endl; string s2(hello worldxxxxxxxxxxxxx); cout 长度 s2.size() endl; cout 容量 s2.capacity() endl endl; /*--------------------要求string保留至少20个字符的容量--------------------*/ cout 要求string保留至少20个字符的容量 endl; s2.reserve(20); cout 长度 s2.size() endl; //长度不变 cout 容量 s2.capacity() endl endl; //容量不变 /*--------------------要求string保留至少28个字符的容量--------------------*/ cout 要求string保留至少28个字符的容量 endl; s2.reserve(28); cout 长度 s2.size() endl; //长度不变 cout 容量 s2.capacity() endl endl; //容量可能增长 /*--------------------要求string保留至少40个字符的容量--------------------*/ cout 要求string保留至少40个字符的容量 endl; s2.reserve(40); cout 长度 s2.size() endl; //长度不变 cout 容量 s2.capacity() endl endl; //容量进一步增长 /*--------------------清空字符串内容--------------------*/ cout 清空字符串内容 endl; s2.clear(); //注意这只会清除内容不会释放已分配的内存 cout 长度 s2.size() endl; //长度为0 cout 容量 s2.capacity() endl endl; //容量保持不变 return 0; }在这里插入图片描述std::string::resize在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { //1.初始化字符串str为I like to code in C string str(I like to code in C); cout str \n; //输出初始字符串 //2.获取当前字符串的长度字符数量不包含结尾的空字符\0 unsigned sz str.size(); //3.调整字符串长度在原有长度基础上增加2个字符 str.resize(sz 2, ); //新增的字符用填充 cout str \n; //输出调整后的字符串末尾多了两个 //4.再次调整字符串长度将长度改为14个字符 str.resize(14); //注意若新长度小于原长度会截断字符串只保留前14个字符 cout str \n; //输出截断后的字符串前14个字符为I like to code return 0; }在这里插入图片描述3.访问操作std::string::operator[]在这里插入图片描述代码语言javascriptAI代码解释#include iostream #include string using namespace std; int main() { //1.初始化字符串str为Test string string str(Test string); //2.循环遍历字符串中的每个字符并输出 for (int i 0; i str.length(); i) { //2.1使用 operator[] 访问字符串的第i个字符 cout str[i]; } cout endl; return 0; }在这里插入图片描述4.修改操作在这里插入图片描述函数名称功能说明参数说明注意事项push_back(c)在字符串末尾插入单个字符 cc: 要插入的字符char类型效率高于追加单字符但批量操作建议用append或operatorappend(str)在字符串末尾追加另一个字符串支持string/char*/子串str: 要追加的字符串支持多种重载形式比功能更灵活如可追加部分子串或重复字符operator(str)最常用的字符串追加方式支持string/char*/字符str: 要追加的内容支持字符串或单字符代码简洁性能与append()相当推荐日常使用insert(pos, str)在指定位置 pos 插入字符串 str支持多种插入形式pos: 插入位置索引str: 要插入的内容字符串 / 字符 / 子串等插入后原位置及后续字符自动后移pos 超出范围会抛出异常at() 风格重载或导致未定义行为[] 风格erase(pos, len)从位置 pos 开始删除 len 个字符len 省略时删除到末尾pos: 起始删除位置len: 要删除的字符数可选若 pos 超出范围会抛出异常若 len 超出剩余字符数仅删除到字符串末尾关于 string 需注意以下两点1. 尾部追加字符的三种方式s.push_back(c)向string尾部添加单个字符cs.append(1, c)明确指定追加 1 个字符cs c简洁的运算符重载方式既可以追加单个字符c也能直接连接字符串如hello实际应用中操作因语法简洁、适用场景灵活字符 / 字符串均可是最常用的追加方式www.dongchedi.com/article/7597217223819772478www.dongchedi.com/article/7597215233471889944www.dongchedi.com/article/7597216873696526910www.dongchedi.com/article/7597217143041737241www.dongchedi.com/article/7597214870441935385www.dongchedi.com/article/7597214599947043353www.dongchedi.com/article/7597214580846477886www.dongchedi.com/article/7597216071082738201www.dongchedi.com/article/7597214433031078424www.dongchedi.com/article/7597214537498362392www.dongchedi.com/article/7597215399566361150www.dongchedi.com/article/7597215658752868888www.dongchedi.com/article/7597215102077141528www.dongchedi.com/article/7597214696924004889www.dongchedi.com/article/7597213042329895448www.dongchedi.com/article/7597215125493400126www.dongchedi.com/article/7597212587801018905www.dongchedi.com/article/7597214580846215742www.dongchedi.com/article/7597214267869692440www.dongchedi.com/article/7597213056480969278www.dongchedi.com/article/7597212812516639257www.dongchedi.com/article/7597212812516868633www.dongchedi.com/article/7597213320844182041www.dongchedi.com/article/7597211160895046206www.dongchedi.com/article/7597211076186374681www.dongchedi.com/article/7597212587801477657www.dongchedi.com/article/7597210839670080062www.dongchedi.com/article/7597210276412899864www.dongchedi.com/article/7597211030086926872www.dongchedi.com/article/7597211160895078974www.dongchedi.com/article/7597209997126238744www.dongchedi.com/article/7597209064238039577www.dongchedi.com/article/7597211030087287320www.dongchedi.com/article/7597209862904480318www.dongchedi.com/article/7597209319725253145www.dongchedi.com/article/7597208525277987353www.dongchedi.com/article/7597208525278151193www.dongchedi.com/article/7597210268858958398www.dongchedi.com/article/7597209475426435609www.dongchedi.com/article/7597209772429476377www.dongchedi.com/article/7597201951176213017www.dongchedi.com/article/7597201687174562366www.dongchedi.com/article/7597199724889997849www.dongchedi.com/article/7597199550092657177www.dongchedi.com/article/7597200248943329816www.dongchedi.com/article/7597199001863701017www.dongchedi.com/article/7597198298541834777www.dongchedi.com/article/7597200591446000190www.dongchedi.com/article/7597199968348357145www.dongchedi.com/article/7597199312984162841www.dongchedi.com/article/7597199429019861566www.dongchedi.com/article/7597196791863902782www.dongchedi.com/article/7597197725960110616www.dongchedi.com/article/7597197533550920217www.dongchedi.com/article/7597196766895079960www.dongchedi.com/article/7597197878439756313www.dongchedi.com/article/7597196909912031768www.dongchedi.com/article/7597195764053492248www.dongchedi.com/article/7597196370181030424www.dongchedi.com/article/7597195961618121241www.dongchedi.com/article/7597195004385182232www.dongchedi.com/article/7597196281857442366www.dongchedi.com/article/7597195368090075673www.dongchedi.com/article/7597195809683505689www.dongchedi.com/article/7597194439940932158www.dongchedi.com/article/7597194164794933822www.dongchedi.com/article/7597194060553749016www.dongchedi.com/article/7597195414877995544www.dongchedi.com/article/7597194911112479256www.dongchedi.com/article/7597194219174068761www.dongchedi.com/article/7597192718418756120www.dongchedi.com/article/7597191743318065689www.dongchedi.com/article/7597194069471003161www.dongchedi.com/article/7597193401016500760www.dongchedi.com/article/7597192147254772286www.dongchedi.com/article/7597192394672505406www.dongchedi.com/article/7597190301329080894www.dongchedi.com/article/7597188998091833881www.dongchedi.com/article/7597190006675243582www.dongchedi.com/article/7597189866363372056