ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

C++(STL)——string(一)

C++(STL)——string(一) 个人主页ꪔ小林Y✨个人专栏《C小白闯关日记》《C语言小白闯关日记》《数据结构入门——从原理到实战》,《拾光Linux》代码信条每一行代码都是成长的脚印每一次调试成功都是对坚持的回应目录STLSTL六大组件string类1.string类对象的常见构造2.string类对象的访问及遍历操作3.迭代器const迭代器反向迭代器4.auto关键字和范围for5.string类对象的容量操作sizecapacityreserveshrink_to_fitresize6. string类对象的修改操作![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/34e12beece134b218129c5276b0d9b78.png)push_backappendoperatorinserteraserepalce7.字符串操作find......8 getline/swap......例题例题1找出所有空格并替换为%%例题2字符串中的第一个唯一字符例题3字符串最后一个单词的长度例题4字符串相加STLSTL是C标准库的重要组成部分不仅是一个可重复用的组件库而且是一个包罗数据结构与算法的软件框架。有多个版本我们会进行SGI版本的部分代码STL六大组件string类1.string类对象的常见构造#includeiostream#includestringusingnamespacestd;voidtest_string1(){string s1;// 构造空的string类对象s1strings2(hello world);// 用C格式字符串构造string类对象s2strings3(s2);// 拷贝构造s3}intmain(){test_string1();return0;}2.string类对象的访问及遍历操作#includeiostreamusingnamespacestd;voidtest_string2(){voidtest_string2(){strings1(hello world);couts1endl;s1[0]x;couts1endl;//修改后的字符串couts1[0]endl;//字符串某位置的字符couts1.size()endl;couts1.length()endl;//遍历修改for(size_t i0;is1.size();i){s1[i];}couts1endl;}}intmain(){try{test_string2();}catch(constexceptione){coute.what()endl;}return0;}3.迭代器特点提供统一的方式遍历修改容器算法可以泛型化算法借助迭代器处理容器的数据voidtest_string2(){strings1(hello world);couts1endl;s1[0]x;couts1endl;//修改后的字符串//迭代器//行为像指针string::iterator it1s1.begin();while(it1!s1.end()){(*it1)--;cout*it1 ;it1;}coutendl;}const迭代器//const修改迭代器本身const对象不是使用const iterator去遍历voidPrint(conststrings){string::const_iterator it1s.begin();while(it1!s.end()){//*it1x//不能修改cout*it1 ;it1;}coutendl;}反向迭代器voidPrint(conststrings){string::const_reverse_iterator it2s.rbegin();while(it2!s.rend()){cout*it2 ;it2;}coutendl;}4.auto关键字和范围forauto通过初始化值类型自动推导对象类型inti0;autoji;//(int)autok10;//(int)autop1i;auto*p2i;//一定是指针//引用intr1i;autor2r1;范围for遍历某个字符串或链表for循环后的括号由冒号“ ”分为两部分第一部分是范围内用于迭代的变量第二部分则表示被迭代的范围strings1(hello world);//范围for自动取容器数据赋值自动迭代自动判断结束for(autoch:s1){coutch ;}coutendl;5.string类对象的容量操作sizecapacityvoidtest_string3(){strings1(hello world);couts1.max_size()endl;couts1.size()endl;//不包含结尾的\0couts1.capacity()endl;//实际存储有效字符个数不包含结尾的\0s1.clear();couts1.size()endl;//不包含结尾的\0couts1.capacity()endl;//实际存储有效字符个数不包含结尾的\0}reserve为字符串预留空间为string预留空间不改变有效元素个数当reserve的参数小于string的底层空间总大小时reserve不会改变容量大小。strings2(hello world);couts2.size()endl;couts2.capacity()endl;s2.reserve(20);couts2.size()endl;couts2.capacity()endl;shrink_to_fit不建议用代价大以时间换空间s2.shrink_to_fit();//缩容couts2.size()endl;couts2.capacity()endl;resize将有效字符的个数改成n个多出的空间用字符c填充strings3(hello world);s3.resize(5);//当前对象的size相当于保留前n个删除后面的数据couts3endl;s3.resize(10,x);//当前对象的size插入数据couts3endl;6. string类对象的修改操作push_back在字符串后尾插字符voidTestCapacity(){string s1;size_t olds1.capacity();couts1.capacity()endl;for(size_t i0;i100;i){s1.push_back(x);if(s1.capacity()!old){couts1.capacity()endl;olds1.capacity();}}}append在字符串后追加一个字符串voidtest_string4(){strings1(HELLO WORLD);s1.push_back(%);s1.append(hello cat);couts1endl;s1.append(10,#);couts1endl;strings2(hello world);s1.append(s2.begin(),--s2.end());couts1endl;}operator在字符串后追加字符串strstrings3(hello world);s3 ;s3hello dog;couts3endl;couts3hahahaendl;couthahahas3endl;insertvoidtest_string5(){strings1(hello world);couts1endl;s1.insert(0,hihihi);couts1endl;s1.insert(0,1,#);couts1endl;}erasestrings2(hello world);couts2endl;s2.erase(s2.begin());//头删couts2endl;s2.erase(0,1);//头删couts2endl;repalcestrings3(hello,world);couts3endl;s3.replace(5,1,%%%);couts3endl;7.字符串操作find…8 getline/swap…例题例题1找出所有空格并替换为%%voidtest_string6(){strings1(hello world hello world);couts1endl;/*size_t pos s1.find( ); while (pos ! string::npos) { s1.replace(pos, 1, %%); pos s1.find( , pos 2); } cout s1 endl;*/string s2;for(autoch:s1){if(ch! ){s2ch;}else{s2%%;}}couts2endl;}例题2字符串中的第一个唯一字符classSolution{public:intfirstUniqChar(string s){intcount[26]{0};for(autoch:s){count[ch-a];}for(size_t i0;is.size();i){if(count[s[i]-a]1)returni;}return-1;}};例题3字符串最后一个单词的长度#includeiostream#includestringusingnamespacestdintmain(){string str;getline(cin,str);size_t posstr.rfind( );if(pos!str.size()){coutstr.size()-(pos1)endl;}else{coutstr.size()endl;}}例题4字符串相加classSolution{public:stringaddStrings(string num1,string num2){intend1num1.size()-1,end2num2.size()-1;intcarry0;string retStr;retStr.reserve(max(num1.size(),num2.size())1);while(end10||end20){intval1end10?num1[end1--]-0:0;intval2end20?num2[end2--]-0:0;intretval1val2carry;carryret/10;retret%10;//头插//retStr.insert(0,1,0ret);retStr(0ret);}//最后还有一个进位要头插if(carry)retStr1;reverse(retStr.begin(),retStr.end());returnretStr;}};到这儿CSTL——string的内容就结束了。如果文中有表述不准的地方或是你有更清晰的理解思路强烈欢迎在评论区留言交流——技术路上多碰撞才能更快进步觉得内容对你有帮助的话别忘了点赞❤️➕收藏方便后续回顾复习想跟着一起系统学习数据结构的朋友也可以点击关注下一期我们会聚焦更进一步的学习。不见不散✌️
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进