发布时间:2026/9/1 7:31:08
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的内容就结束了。如果文中有表述不准的地方或是你有更清晰的理解思路强烈欢迎在评论区留言交流——技术路上多碰撞才能更快进步觉得内容对你有帮助的话别忘了点赞❤️➕收藏方便后续回顾复习想跟着一起系统学习数据结构的朋友也可以点击关注下一期我们会聚焦更进一步的学习。不见不散✌️

相关新闻

2026/9/1 7:31:08

从双写到一致:Redis缓存与数据库一致性方案全解析

一、引言:为什么会有双写一致性问题? 在互联网高并发系统中,Redis 作为缓存层几乎已经成为标配。引入缓存的初衷很简单——减轻数据库压力,提升读取性能。但缓存一旦引入,一个绕不开的问题就浮出水面:数据库…

2026/9/1 7:31:08

STM32驱动DHT11温湿度传感器:从单总线时序到代码实战

简介:一份基于STM32F10X系列的DHT11温湿度传感器驱动程序资料,主要面向嵌入式初学者以及需要在STM32平台上快速实现单总线通信的开发者。资源围绕DHT11单总线通信协议展开,详细说明如何通过GPIO与定时器完成启动信号发送、27us/50us高低电平时…

2026/9/1 7:46:08

亲手实现Transformer核心:注意力机制从原理到PyTorch代码

为什么我把"看懂的"Transformer又亲手写了一遍Transformer 这个词,在深度学习圈子里几乎被说烂了。从 NLP 到 CV,从推荐系统到多模态,随处可见它的影子。但很多时候,我们看完了各种图解、听完了各种原理讲解&#xff0c…

2026/9/1 7:46:08

使用窗口函数

在复杂数据分析、报表统计、排名计算等场景中经常使用。窗口函数是 SQL 中非常强大的功能,可以在不改变行数的情况下对每一行进行计算,同时保留原始数据。 下面我从核心概念、语法结构、常用函数分类、实战案例、性能优化几个维度来系统说明。&#x1f3…

2026/9/1 7:46:08

《雾雾恋综》本地大模型驱动的剧本文案生产线搭建指南

《雾雾恋综》这个项目,第一眼看上去更像一部网文或者短剧选题:双女主、恋综、悬念感。但真正让我感兴趣的是,它能不能不再靠人工逐段憋稿,而是变成一条可由本地大模型驱动的剧本文案生产线。这篇文章就围绕这个题材,拆…

2026/9/1 7:46:08

基于AT89C51与Proteus仿真的多功能电子琴设计与实现

简介:本资源是一套基于AT89C51单片机的C语言多功能电子琴系统完整开发包,面向嵌入式初学者、单片机课程设计学生及Proteus仿真爱好者,解决从硬件建模、音阶生成到人机交互实现的一体化实践难题。压缩包共23个文件,含4个C源码&…

2026/9/1 7:46:08

COC跑团熟肉制作全指南:从音轨提取到硬字幕压制

说到 COC 跑团视频里的“熟肉”,很多观众的第一印象是字幕菌真伟大,第二印象可能就是:这个视频怎么还不更新?实际做过熟肉的人才会明白,最折磨人的往往不是翻译本身,而是从生肉到熟肉这条工具链上随时可能冒…

2026/9/1 7:41:08

QCustomPlot极坐标图叠加普通曲线:坐标转换与混合绘制实践

简介:Mathimge_Plot是一款专为DELPHI开发者设计的曲线图控件,支持绘制直线、曲线、函数图像、散点图与3D图形,适合科学计算、数据分析和工程应用场景,可灵活调整颜色、线型、标记样式等细节。压缩包共125个文件,仅394K…

2026/8/31 1:05:20

vSound小提琴数字处理器实操指南:从接线到演出的完整配置

电小提琴或者原声小提琴插电演出,第一个绕不开的坎就是声音难听。原声琴的共鸣和空气感一旦进了拾音器,出来的往往是一坨干瘪、发尖、带着奇怪塑料味的信号。我当初第一次把琴接上乐队调音台,直接被主唱吐槽"你这声音像在锯钢丝"。…

2026/8/31 2:14:20

传感器接口IC如何攻克生物化学传感的微弱信号难题?

1. 从电极到比特流:为什么生物化学传感必须依赖专用接口IC 做生物化学传感的人都有过类似的经历:明明传感器本身性能很好,信号输出却一塌糊涂——噪声大、漂移明显、重复性差,怎么调都达不到预期。很多时候问题并不在传感器&#…

2026/9/1 7:04:43

STM32F411CEU6多通道ADC采集:扫描模式+DMA实现详解

1. 多通道 ADC 的用武之地把“Multichannel ADC”和“STM32F411CEU6”这两个关键字放在一起,其实就是嵌入式开发里最常遇到的一类需求:用一块不算贵的 MCU,同时采集多路模拟信号。STM32F411CEU6 是 48 引脚的 Cortex-M4F 主控,主频…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

2026/9/1 0:00:42

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行&#xff0c;Type-C接口算是典型的“看着简单&#xff0c;做起来全坑”的东西。光引脚就24个&#xff0c;高低速信号、电源、控制线全部塞在一个小小的连接器里&#xff0c;如果PCB布局不做规划&#xff0c;打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/1 0:00:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/1 0:00:42

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…