建设局查询网站,网站做任务给钱的,wordpress子文件夹建站,东莞建网站公司平台string类的使用一、auto 关键字#xff1a;简化类型声明的利器二、string 类#xff1a;更安全的字符串处理方案1、常见构造2、容量操作3、访问及遍历操作4、string 类的其他常用操作三、常用遍历1、C11遍历2、迭代器遍历3、for遍历四、string 类的实现原理#xff08;进阶简化类型声明的利器二、string 类更安全的字符串处理方案1、常见构造2、容量操作3、访问及遍历操作4、string 类的其他常用操作三、常用遍历1、C11遍历2、迭代器遍历3、for遍历四、string 类的实现原理进阶传统写法现代写法五、string 类的实际应用场景一、auto 关键字简化类型声明的利器自动类型推导无需显式指定类型编译器根据初始化值确定变量类型简化复杂声明对于迭代器、函数返回值等冗长类型auto能大幅精简代码指针与引用规则声明指针时auto与auto*效果一致如auto p a与auto* p a等价声明引用必须显式添加如auto ref a多变量声明限制同一行声明的多个变量必须为相同类型如auto a 1, b 2合法auto a 1, b 2.0非法使用限制必须在声明时初始化无法单独声明auto x;不能作为函数参数类型如void func(auto x)不合法不建议作为函数返回值类型可能导致类型模糊不能用于声明数组如auto arr[10]不合法#includeiostream#includetypeinfo// 需包含此头文件以使用 typeidusingnamespacestd;intgetNum(){return42;}intmain(){inta10;autoba;// 推导为 intautoca;// 推导为 charautodgetNum();// 推导为 intauto*pa;// 推导为 int*与 auto p a 等价autorefa;// 推导为 int// 打印推导的类型不同编译器输出可能略有差异coutb 的类型typeid(b).name()endl;// intcoutc 的类型typeid(c).name()endl;// charcoutd 的类型typeid(d).name()endl;// intcoutp 的类型typeid(p).name()endl;// int*return0;}二、string 类更安全的字符串处理方案C 标准库的string类封装了字符串的创建、修改和操作相比 C 风格字符数组char*提供了自动内存管理和丰富的成员函数是字符串处理的首选。核心优势自动内存管理无需手动malloc/free或new/delete避免内存泄漏安全性内置越界检查减少缓冲区溢出风险丰富接口提供拼接、查找、截取等便捷操作兼容性支持与 C 风格字符串const char*相互转换动态扩展可自动调整容量以适应字符串长度变化1、常见构造constructor函数名称功能说明string()构造空字符串默认构造string(const char* s)用 C 风格字符串初始化string(const strings)拷贝构造复制已有 string 对象string(size_t n, char c)构造包含 n 个字符 c 的字符串构造包含n个字符c的string类对象#includestringusingnamespacestd;intmain(){string s1;// 空字符串strings2(hello);// 用 C 字符串初始化strings3(s2);// 拷贝构造strings4(5,!);// 5个感叹号!!!!!couts2: s2endl;// 输出hellocouts4: s4endl;// 输出!!!!!return0;}2、容量操作函数名称功能说明size返回有效字符长度推荐使用替代length()empty判断字符串是否为空为空返回trueclear清空有效字符不释放底层内存reserve预留至少 n 个字符的空间提升插入效率resize(n, c)调整有效字符数为 n多余位置用 c 填充一般情况下都是用size()而不是length()2.clear()只是将string中有效字符清空不改变底层空间大小3.resize(n)与resize(n, c)的区别- 前者将多余位置初始化为空字符’\0’- 后者将多余位置初始化为指定字符 c- 若n大于当前容量会扩容若n小于当前长度仅截断不缩容4.reserve(n)仅预留空间不改变有效字符数n 小于当前容量时不做操作#includeiostreamusingnamespacestd;intmain(){strings1(hello world);couts1.size()endl;//11couts1.empty()endl;//0s1.clear();couts1endl;//打印空string s2;s2.reserve(100);couts2.capacity()endl;//111//左(要初始化个数)右(初始化的字符)s2.resize(4,c);couts2endl;//ccccreturn0;}3、访问及遍历操作方式适用场景operator[]通过下标访问支持读写类似数组beginend正向迭代器从首到尾遍历适用于所有 STL 容器begin()指向首字符end()指向尾字符后一位rbeginrend反向迭代器从尾到首遍历rbegin()指向尾字符rend()指向首字符前一位范围forC11 新增简洁遍历所有元素底层基于迭代器#includeiostream#includestringusingnamespacestd;intmain(){strings(hello);// 1. 下标访问cout第2个字符s[1]endl;// es[0]H;// 修改首字符为Hcout修改后sendl;// Hello// 2. 正向迭代器cout正向遍历;for(autoits.begin();it!s.end();it){cout*it ;// H e l l o}coutendl;// 3. 反向迭代器cout反向遍历;for(autoits.rbegin();it!s.rend();it){cout*it ;// o l l e H}coutendl;// 4. 范围 forC11cout范围for遍历;for(charch:s){coutch ;// H e l l o}coutendl;return0;}4、string 类的其他常用操作函数名称功能说明operator字符串拼接支持 string 或 C 字符串append()尾部追加字符串功能类似c_str()返回 C 风格字符串const char*find(sub, pos)从 pos 位置开始查找子串 sub返回起始索引未找到返回string::npossubstr(pos, len)从 pos 位置截取长度为 len 的子串默认截取到末尾compare()比较与字符串 s 的大小返回 0 表示相等#includeiostream#includestringusingnamespacestd;intmain(){string s1hello;string s2world;// 字符串拼接s1 ;s1s2;couts1endl;// 输出hello world// 查找操作size_t poss1.find(world);if(pos!string::npos){cout找到子串位置posendl;// 输出6}// 截取子串string s3s1.substr(6,5);couts3endl;// 输出world// C风格字符串转换constchar*cstrs1.c_str();coutcstrendl;// 输出hello worldreturn0;}三、常用遍历1、C11遍历适用于数组和支持下标访问的容器如 string、vector需要手动控制索引范围。#includeiostream#includestringusingnamespacestd;intmain(){//C98遍历intarray1[]{1,2,3,4,5};for(inti0;isizeof(array1)/sizeof(array1[0]);i){array1[i]*2;}for(inti0;isizeof(array1)/sizeof(array1[0]);i){coutarray1[i] ;}coutendl;return0;}2、迭代器遍历迭代器是 STL 容器的通用遍历方式适用于所有容器包括不支持下标访问的容器如 list、map 等。![[QQ20251203-213626.png]]#includeiostream#includestringusingnamespacestd;intmain(){strings1(hello world);//正向迭代器//string::iterator it s1.begin();autoits1.begin();while(it!s1.end()){cout*it ;it;}coutendl;//反向迭代器//string::reverse_iterator rit s1.rbegin();autorits1.rbegin();while(rit!s1.rend()){cout*rit ;rit;}coutendl;conststrings2(hello world);//const正向迭代器//string::const_iterator cit s2.begin();autocits2.begin();while(cit!s2.end()){cout*cit ;cit;}coutendl;//const反向迭代器//string::const_reverse_iterator rcit s2.rbegin();autorcits2.rbegin();while(rcit!s2.rend()){cout*rcit ;rcit;}return0;}3、for遍历一种简洁的遍历方式自动迭代容器中所有元素底层基于迭代器实现。语法格式for(元素类型 变量名:容器名){// 循环体}#includeiostream#includestringusingnamespacestd;intmain(){// 数组遍历intarray2[]{1,2,3,4,5};for(autoe:array2)// 使用引用避免拷贝支持修改元素e*2;for(autoe:array2)coute ;// 输出2 4 6 8 10coutendl;// 字符串遍历stringstr(hello world);for(autoch:str){coutch ;// 输出h e l l o w o r l d}coutendl;return0;}四、string 类的实现原理进阶了解 string 类的实现有助于更好地理解其特性下面展示两种经典的实现方式传统写法通过显式分配和释放内存实现深拷贝确保每个对象拥有独立的字符串资源classString{public:// 构造函数String(constchar*str){if(nullptrstr){assert(false);return;}_strnewchar[strlen(str)1];// 分配空间包含结束符strcpy(_str,str);// 拷贝内容}// 拷贝构造函数String(constStrings):_str(newchar[strlen(s._str)1]){strcpy(_str,s._str);}// 赋值运算符重载Stringoperator(constStrings){if(this!s)// 避免自赋值{char*pStrnewchar[strlen(s._str)1];strcpy(pStr,s._str);delete[]_str;// 释放旧空间_strpStr;// 指向新空间}return*this;}// 析构函数~String(){if(_str){delete[]_str;_strnullptr;}}private:char*_str;// 存储字符串};现代写法通过交换临时对象的资源简化代码利用临时对象的生命周期自动释放内存classString{public:// 构造函数String(constchar*str){if(nullptrstr){assert(false);return;}_strnewchar[strlen(str)1];strcpy(_str,str);}// 拷贝构造函数现代写法String(constStrings):_str(nullptr){StringstrTmp(s._str);// 创建临时对象swap(_str,strTmp._str);// 交换资源}// 赋值运算符重载现代写法Stringoperator(String s)// 传值参数会触发拷贝构造{swap(_str,s._str);// 交换资源临时对象会自动释放旧资源return*this;}// 析构函数~String(){if(_str){delete[]_str;_strnullptr;}}private:char*_str;};五、string 类的实际应用场景文本处理日志记录、配置文件解析、字符串格式化用户交互命令行输入输出、GUI 文本控件网络编程HTTP 协议处理、数据报文组装与解析文件操作路径处理、文件内容读写数据转换数值与字符串的相互转换掌握auto和string是 C 开发的基础合理使用能显著提升代码简洁性和安全性。实际开发中建议优先使用标准库提供的string而非 C 风格字符串减少内存管理风险。