尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
初识STL:string1
1.STL简介1.1介绍STL是c标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包含数据结构和各种常见算法的软件框架1.2STL的六大组件容器算法迭代器仿函数空间配置器配接器其中容器就是我们之前学过的数据结构,* 仿函数,配接器,空间配置器我们之后详细讲解 *,算法包含一些常用算法,比如逆置,交换等等.我们之前自己实现过各种数据结构,每种数据结构都有截然不同的遍历方式,如果每个结构在库中都有一个自己的遍历函数那也太麻烦了.这就是迭代器的作用之一:每个数据结构都有一个迭代器组件用来遍历数据,那么如果在一个算法中需要遍历,传递迭代器模板就可以了.这就使得容器 算法相互脱离,降低耦合度,算法更加通用2.迭代器,auto和范围for2.1.迭代器的使用begin()和end()函数begin和end用来确定迭代器的遍历范围,值得注意的是这两个函数都有一个const成员函数重载:const修饰成员函数确保此函数不会修改调用它的对象.虽然只写一个const类型就够用—不管是普通对象还是const对象都可以调用,编译器允许权限的缩小,会把普通类型变成const修饰类型.但是如果我传递一个普通对象希望在函数中能修改结果却调用了const函数,这是不合理的.因此设置重载,各自调用各自的.其他begin和end虽然在string中为迭代器写了很多begin和end,但是常用的只有普通迭代器和反向迭代器:iterator本身不能被const修饰,因为迭代器想要遍历就需要,所以取名叫const_iterator.rbegin和rend会分别得到末尾和开头从后往前遍历.2.2.auto与范围for相比迭代器来讲范围for方便很多,不需要主动调用范围也不用在循环中遍历.3.string的常用接口3.1构造函数构造中比较常用的是无参默认构造,字符串构造和拷贝构造第三种构造方式中的npos是string中的一个静态成员变量,存储int的最大值,因为构造时开不了这么大的空间.所以当不传递长度的时候就会使用缺省值npos,将pos位置之后的值全部拷贝(同理当传递的长度大于实际长度时不会报错,也会只拷贝到结束)3.2赋值重载3.3string::sizesize_t size() const;用于计算返回一个对象的长度.string::lenth和它的用途一样,只是人们认为这个函数名不通用(string存储字符串,可以叫做长度,但是像树,图等这些结构叫做长度不太合适)3.4string::max_size用于返回一个字符串中可能存储的理论最大值,但是没有什么实际意义,约等于2G,实际上开不出这么大的空间.3.5string::push_back和之前顺序表的原理一样,在每一次尾插的时候都会检查空间是否足够,不够的话会进行扩容.在vs编译器下除了第一次扩容是二倍,之后都是1.5倍扩大空间,而在Linux系统下是2倍扩大.string::capacity函数用于查看当前开辟的空间.3.6operator[]operator[]是更适合string使用的遍历修改方式,类似于普通数组的下标访问3.7operatoroperator用来在字符串后面追加字符,支持传递string对象,字符串以及单个字符.3.8appendappend也是在字符串末尾继续追加字符,提供了一系列重载,但是相比于并不常用.3.9insert一个插入函数,重载了多样的插入方式,下面只介绍几种常用类型3.10replace提供多种重载的替换函数3.11eraseerase用于删除指定位置长度的数据,如果不传值就默认全部删除,迭代器版本的暂时不详细展开3.12assign使用来源对象的内容替换调用对象内容3.13eraseerase用来删除指定长度的数据,如果传递范围过长或不传递范围使用缺省值npos,就会直接删除到末尾4.有关空间的string接口4.1resizeresize用来设置字符串长度4.2reservereserve是一个调整空间大小的函数.如果要扩大当前空间,编译器绝大多数情况下会执行异地扩容(开辟一块新空间,拷贝数据,释放旧空间),不过由于一些对齐,编码原因,实际扩容出的大小要比需求的大一些.如果我们能提前知道某个对象最多需要多少空间就可以提前使用reserve把空间开出来,减少后续的扩容次数提高效率.如果传递的值比空间小,也就是说想要让编译器缩容.这种情况是不被约束的,编译器的行为大多都是无视该指令,什么都不做,如果想要缩容需使用专门提供的shrink_to_fit函数.缩容的过程是开辟新的小空间,(语法不允许部分释放空间,只能整块释放)拷贝部分数据,释放原空间,消耗不必扩容小,这是一种用时间换空间的低效策略.并且在缩容后如果添加数据就又会立即扩容,使得消耗更大.如果不是空间实在紧缺,尽量避免缩容行为4.3shrink_to_fit缩容函数,会将空间缩减到size大小.但是这个函数也是一种不受约束的行为,编译器会尽力缩小到size,但也可能比size稍大一点.不推荐使用该函数.4.4clear删除对象中的内容,将size变为0,空间不变4.5empty检查字符串是否为空(size0),为空则返回true,否则返回false5.其他比较常用的成员函数5.1c_strc_str用于一些特殊情况下,比如只提供c语言接口无法调用string的时候用c_str返回char*指针进行读取等操作5.2copy把调用对象中从pos位置开始的len长度内容拷贝到数组s中,用的很少.5.3findfind是一个很常用的查找函数.找不到的时候会返回-1,但是由于返回类型是size_t,所以会变成int的最大值.strings3(Searches the string for the first occurrence);size_t i5s3.find( );while(i5!string::npos)//npos是静态成员变量,访问时需要突破类域{s3.replace(i5,1,%%);i5s3.find( ,i5);}couts3endl;//这样写需要大量移动 太费时间string s4;for(autoch:s3)//范围for{if(ch! ){s4ch;}else{s4%%;}}autoit1s3.begin();//迭代器while(it1!s3.end()){if((*it1)! ){s4(*it1);}else{s4%%;}it1;}for(size_t i0;is3.size();i)//下标访问{if(s3[i]! ){s4s3[i];}else{s4$$;}}couts4endl;//以上三种遍历方法都可以达到目的,空格替换成%%5.4rfindrfind是从后往前寻找.参数pos是从后往前开始的位置strings3(Searches the string for the first occurrence);strings4( );size_t i5s3.rfind(s4);while(i5!string::npos){s3.replace(i5,1,%%);//i5 s3.rfind(s4,i5); size_t rfind (const string str, size_t pos npos) const//i5 s3.rfind( , i5); size_t rfind (const char* s, size_t pos npos) const//i5 s3.rfind( , i5, 1); size_t rfind (const char* s, size_t pos, size_t n) consti5s3.rfind( ,i5);//size_t rfind (char c, size_t pos npos) const}couts3endl;5.5find_first_of5.6find_first_not_of5.7substrsubstr和构造函数的某一个重载功能类似,将调用对象从pos位置开始长度len的字符串作为一个新字符串返回5.8operator注意到operator是一个全局函数,这是为了解决成员函数第一个参数固定为调用对象的问题,全局函数的第一个参数就可以是const char*5.9getline流插入cin的性质类似scanf,读取到空格就停下,如果我们想要读取一行就可以用getline(getline是一个全局函数)getline的重载还支持在遇到特殊符号时停止
RELATED

相关推荐

思源宋体CN完整指南:7种字重开源中文字体的专业配置终极方案

思源宋体CN完整指南:7种字重开源中文字体的专业配置终极方案

思源宋体CN完整指南:7种字重开源中文字体的专业配置终极方案 【免费下载链接】source-han-serif-ttf Source Han Serif TTF 项目地址: https://gitcode.com/gh_mirrors/so/source-han-serif-ttf 思源宋体CN是由Adobe与Google联合开发的开源中文字体&#xff…

📅 2026/9/28 3:49:00
【飞控开发实战·⑫】Mission Planner配置详解:ArduPilot地面站安装、传感器校准、飞行模式设置与航点任务规划

【飞控开发实战·⑫】Mission Planner配置详解:ArduPilot地面站安装、传感器校准、飞行模式设置与航点任务规划

12.1 Mission Planner安装与连接Mission Planner是ArduPilot生态中常用的Windows地面站软件,可用于固件刷写、参数配置、传感器校准、飞行模式设置、航线规划以及日志下载与分析。第一次连接飞控时,建议先通过USB完成基础配置,再根据户外使用…

📅 2026/10/11 15:08:27
【飞控开发实战·⑪】Betaflight Configurator配置详解:加速度计校准、电机排序、接收机设置与PID调参全流程

【飞控开发实战·⑪】Betaflight Configurator配置详解:加速度计校准、电机排序、接收机设置与PID调参全流程

Betaflight Configurator 是 ZP_H743 飞控在 Betaflight 固件下的核心配置工具。本章将从首次连接开始,逐步深入到各项高级配置,帮助读者全面掌握 Betaflight Configurator 的使用方法。特别针对 FPV 花飞和 PID 调参两大核心场景,提供详尽的…

📅 2026/10/11 2:11:01
MORE NEWS

更多资讯

📰

无人机视角航拍古建筑屋顶缺陷损毁识别分割数据集labelme格式605张7类别

数据集格式:labelme格式(不包含mask文件,仅仅包含jpg图片和对应的json文件)图片数量(jpg文件个数):605标注数量(json文件个数):605标注类别数:7标注类别名称:["mucaiwailu","taxiankongdong",&quo…

📰

Fiddler抓包改金额实战:支付接口信任边界与漏洞测试

简介:针对需要掌握Fiddler抓包与请求篡改技术的测试人员、安全学习者和开发者,这套教程与工具包提供了从环境配置到实战操作的完整参考。资源共52个文件,大小10.62MB,包含13个exe工具、12个dll依赖库、14个dat配置文件、4个wav演示…

📰

采集网关的四种路线:把授权成本算清楚

采集网关的四种路线:把授权成本算清楚 📚 MES 集成商系列 09/13上一篇《老设备改造场景集》解决的是"能不能接",这一篇解决"用什么接"。 选型的时候,大家习惯比"谁更便宜"。但授权费往往不是采集这…

📰

SpringBoot+Vue前后端分离实战:学院个人信息管理系统部署与踩坑指南

看到“可直接运行”这五个字,我的第一反应是不太相信。不是怀疑这套系统的功能,而是作为常年帮人处理这类入门项目的人,我太清楚所谓可直接运行的前提条件了:作者开发时的JDK版本、MySQL密码、Node版本、依赖镜像源,跟…

📰

Flutter应用鸿蒙NEXT适配:epub_pro库迁移全流程解析

最近在把一款阅读类应用往鸿蒙 NEXT 上迁移,一开始我天真地以为最麻烦的是 Flutter 框架本身的适配,真正动工才发现,卡住进度的反而是 epub_pro 这种深度依赖平台能力的三方库。eps_pro 管着 EPUB 的解析、解压、元数据读取和章节拆分&#x…

📰

【小白也能轻松学会】5 分钟把 OpenClaw 2.6.6 本地 AI 智能体配到 TaoToken

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬