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

发布时间:2026/10/17 12:03:45

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/10/14 0:27:46

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

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

2026/10/11 6:25:46

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

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

2026/10/17 12:00:20

Office2016自定义安装器v3.0实战:组件选择、部署配置与避坑指南

简介:Office2016自定义安装器v3.0免费版是一款面向办公软件用户的安装辅助工具,主要解决Office2016默认安装无法自选磁盘目录、体积庞大易占满C盘导致系统变慢的痛点。它适合希望将Office装到非系统盘、或需要清理旧版Office残留组件的普通用户与运维人员…

2026/10/17 12:00:20

C# 主动推送企业号消息实战:从凭证缓存到告警中枢的完整拆解

简介:这份资源面向使用C#进行企业级应用开发的程序员,聚焦微信企业号主动推送消息这一常见需求,帮助开发者快速掌握通过API向员工或客户高效发送消息的实现方式。压缩包共40个文件,约35KB,以22个cs源码文件为核心&…

2026/10/17 12:00:20

Warm-up与Cosine学习率:训练稳定性的底层机制解析

1. 为什么Warm-up和Cosine衰减不是“高级技巧”,而是训练稳定性的底层开关刚接触深度学习时,我总以为调学习率是最后一步——模型搭好了,数据准备好了,损失曲线跑起来了,才慢悠悠打开lr_scheduler.py改几个数字。直到某…

2026/10/17 12:00:20

Anchor-based 与 Anchor-free 目标检测路线:原理、实战对比与选型指南

做目标检测的人,迟早都会撞上“Anchor-based 与 Anchor-free”这个话题。无论是读论文还是调模型,这两条技术路线的选择几乎决定了你整个项目的基线效果。我最早接触检测时,用的还是Faster R-CNN和YOLOv3那一套,那时候“先验框”这…

2026/10/17 12:00:20

大数据环境下的财政预算执行审计:数据采集与关联分析实战方法

简介:大数据环境下财政预算执行审计与数据采集分析方法课件,主要面向审计机关工作人员、财政管理及数据分析学习者。课件系统梳理财税改革、新常态、五个发展观、八项规定与审计全覆盖等新政策背景,明确预算执行审计的法定性、经常性与宏观性…

2026/10/17 11:55:20

投机解码调优实录:27B大模型从14到159 tok/s

开年前后一直在折腾本地大模型部署,这次要跑的是 Qwen3.8-27B 这个 27B 级别的模型。先说结论:我最终把本地推理速度从最初的 14 tok/s 提到了 159 tok/s,靠的不是换显卡,而是把投机解码(Speculative Decoding&#xf…

2026/10/16 5:33:43

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/16 4:03:48

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/15 13:42:16

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/17 0:04:32

PlanarSLAM:面向曼哈顿世界的点线面联合SLAM系统

简介:本资源是面向机器人视觉与SLAM研究者的C开源RGB-D SLAM系统实现,专为结构化室内场景(如办公室、走廊)设计,通过融合点、线、平面三类几何特征并引入“曼哈顿世界”假设,显著提升位姿跟踪鲁棒性与稠密地…

2026/10/17 0:04:32

TDH Workflow调度实战:从DAG依赖驱动到任务编排与故障排查

1. 从一个调度脚本说起:TDH Workflow到底在解决什么问题第一次接触TDH的Workflow,是在一个数据清洗项目里。当时团队每天要跑几十个ETL任务,任务之间有严格的先后依赖——A表清洗完才能跑B表的关联,B表跑完才能触发C表的聚合。最开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑