分享好友 最新动态首页 最新动态分类 切换频道
C++STL的string类(一)
2024-12-27 02:38

无论c++还是c语言,字符串都是最常见的类之一。我们日常当中写的程序必然要存储数据。
我们的内置类型只能表示基础的信息,无法表示一些复杂的信息,比如int, double.但我们要表示身份证、住址那就表示不了了。

C语言用字符数组来表示字符串,但是这里有一个巨大的缺陷。

1.不够好用
2.不能够很好的管理
比如:用字符数组来存储地址,但是地址的长度要修改呢?这就很麻烦。

所以c++提供了一个管理字符串的一个类,string,你可以把它想象成存储字符的顺序表。

string的底层是一个字符数组,但是你可以把它想象成可以增删查改的数组。

string (const string& str);

 
 

为什么可以这样构造

 

本质是类型转换,把const char* 转换成string.
它是先构造再拷贝构造,然后优化成了构造。

string (const string& str, size_t pos, size_t len = npos);

 
 
 

这里给了一个参数,npos,并且npos=-1;
-1代表什么,这里其实是无符号,所以-1表示42亿九千万。
npos很大意味着取到结束

容量没有把’0’算进去。

size和length

size和length有什么差异

 

没有什么差异。

** 那为什么同时会有这两个东西呢?**
跟STL的发展历史有关。平时用size就可以了。

reserve

** 那假如我知道要开多少空间呢?**
我们可以调用这样一个接口,reserve
知道需要开多少空间,提前开空间,减少扩容,提高效率。

 

注意,你要100的空间,它不一定给你100的空间,它可能为了一些对齐等等的原因,可能开的比100大一些。

resize

resize和reserve功能相似,但也有很大区别。
resize除了开空间它还帮助初始化

 
 

那初始化填了什么值呢
填的是0

那我想填其他的值怎么办呢
比size小,删除数据,保留前5个

 

但是它不会缩容。

这里提一个点,为什么编译器不会轻易的缩容
缩容其实是不支持原地缩的,原地缩荣的话,那以为这要delete一部分空间,这增加了内存管理的难度。
真正缩荣都是开好另一块空间,然后将需要保留的数据拷贝过去。这也意味着缩容肯定会带来性能上的消耗。一般来说不要轻易的缩容。

resize可以删除数据
 
 

string 最好用的地方就是不用去管空间。

尾插

插入字符
 
插入字符串
 

但是我们不管是插入字符还是插入字符串都不喜欢这样写,我们喜欢用运算符重载+=

 

不过+=底层还是调用了push_back和append.

insert

如果我们再头部或者中间插入一个数据,我们就可以用insert

 
 

中间插入

 
 

不推荐经常使用,能不用就不用。因为要挪动数据,影响性能。

erase

删除一个字符

 
 

删除多个字符

 
 

不推荐经常使用,能不用就不用。因为要挪动数据,影响性能。

replace

将hello world 中间空格,替换成%%d

 

replace 能不用就不用,为什么

1.空间不够就要扩容
2.需要挪动数据

有个题目,把hello world i love you 中的所有空格替换成%20

 
 

那上面的代码能不能优化一下呢
每次都是从0的位置开始找,其实没必要。
还有一个点就是,replace可能会扩容。

 

再给大家看个好玩的东西

 
 

这个是以空间换时间的方式,不需要挪动数据。

如果不用[]加下标怎么访问string对象呢,这里要用到迭代器。

 
 

bein()表示第一个字符的地址,end()表示最后一个字符下一个位置的地址。
它是左闭右开。

其实还可以用范围for来访问,不过范围for的底层原理还是迭代器

 

swap

看下面的代码有什么区别

 

s1.swap()和swap()有什么区别
我们知道swap()是类模板,所有类型都可以交换,是泛型模板。

s1.swap()和swap()谁的效率高
很明显s1.swap()的效率更高,s1和s2两段空间,只需要交换两段空间指针的指向就可以了。
而swap()要产生一个临时对象,需要调用拷贝构造,还是深拷贝,然后又需要两次赋值。

c_str

 

两者都可以打印数据,那它们的区别是什么
s1.c_str()是遇到‘0’结束,而cout << s1 << endl;则是根据s1.size()来打印的。

c_str的主要作用还是,为c的接口提供兼容

find

find其实前面已经见过了,再看一个例子,怎样取文件名的后缀。

 
 

如果文件有多个点怎么样找后缀?
倒着找

 
 

除了正着访问string,还可以反着访问,这里要用到反向迭代器。

 
 
 
 

写成这样为什么会报错

 
 
 

为什么要有返回const的迭代器呢
不允许被修改。

普通迭代器和 const迭代器的区别
能不能写的问题。

正向的普通迭代器和const迭代器一共就有4种,我们可以用auto来优化一下迭代器的写法。


最新文章
利用YouTube玩转独立站营销和SEO
YouTube是世界最大的社交平台之一,也是世界第二大的搜索引擎和世界最大的视频网站。虽然网络上能找到很多关于优化YouTube视频创作和频道运营的教程,但是如何利用YouTube来使您的网站实际受益呢?以下8点建议将会帮助你! 接下来,我们会
选品时如何评估竞争热度:搜索量多少算是竞争不激烈?
讲到选品时,我总是反复强调,除非你家大业大资金雄厚运营彪悍,否则,一定要选择偏冷门的产品。 那什么才算是偏冷门的产品呢? 为了让选品更有针对性、可量化,我专门给出建议:选择Best Seller日销量在50-150单的产品。 这样的产品,大卖
正则表达式(awk、sort 、uniq 、tr 工具)
awk 选项 ‘模式或条件{编辑命令}’ 文件1 文件2…. //过滤并输出文件中符合条件的内容 awk -f 脚本文件 文件1 文件2… //从脚本中调用的编辑指令,过滤并输出内容 awk包含几个特殊的内建变量(可直接用)如下所示࿱
限地区: Apple 苹果AI笔记本电脑 2023Mac mini迷你主机 M28G 256G (实测成都等地有效),2785.21元
新款 Mac mini 搭载 M2 和 M2 Pro 芯片,搭载 M2 芯片的机型:M2 芯片具有 4 个性能核心和 4 个能效核心,10 核图形处理器,16 核神经网络引擎,100GB/s 内存带宽;支持 H.264、HEVC、ProRes 和 ProRes RAW 硬件加速,带有视频解码引擎、视
苹果id贷怎么申请—100%下款+苹果回租id贷24小时
苹果id贷怎么申请—100%下款+苹果回租id贷24小时上汽集团等在嘉兴成立股权投资合伙企业,出资额3亿天眼查App显示,近日,嘉兴屹晨股权投资合伙企业(有限合伙)成立,执行事务合伙人为上海上汽恒旭投资管理有限公司,出资额约3亿人民币,经
【U90(Kiss初恋版)WiFi万能钥匙下载】天语U90 Kiss初恋版WiFi万能钥匙5.1.02免费下载
下载WiFi万能钥匙,认准官方正版!免费安全WiFi热点,无忧一键连接。日常任务随时做,轻松赚现金外快~【积分赚钱】完成简单日常任务,轻轻松松赚现金【安全免费】随时随地免费连接,畅享安全免费WiFi,节省流量快人一步!【权威认证】通过
用AI一键生成美女写真,轻松打造你的虚拟女友!
Artbreeder:这个平台利用生成对抗网络(GAN)技术,用户可以通过调节不同的参数(如性别、面部特征)来调制自己想要的照片效果。Artbreeder的优点在于自由度极高,可以生成各种风格的图像,包括超现实主义和动漫风格。但有个缺点是对于新
内衣达人直播权限开通详情步骤,内衣类目怎么可以开直播?电商平台小店开通教程 内衣类目 - 副本
2022年05月17日何***100企业一站式服务,电商平台店铺开通|定向邀约报白|天猫入驻|京东入驻|抖音入驻/快手入驻/小红书入驻/拼多多入驻各电商平台店铺开通 医疗器械 药品 保健品滋补品 食品饮料 酒水 服饰鞋包 珠宝文玩 数码家电 本地生活服
第9章 大模型的伦理安全与隐私9.3 隐私保护技术9.3.1 数据匿名化与脱敏
作者:禅与计算机程序设计艺术 9.3.1 数据匿名化与脱敏 9.3.1.1 背景介绍 在大数据时代,越来越多的个人信息被收集、处理和分析,导致个人隐私风险的显著增加。因此,保护个人隐私成为一个重要的课题,而数
神马优化seo_神马优化关键词快速排名(优化神马搜索引擎关键词排名工具)
1 移动端优化紧张性随着移动互联网的快速发展,手机搜刮用户数量巨大,企业需器重手机网站,否则大概错失大量客户百度神马和搜狗是重要搜刮引擎,各具官方优化指南2 优化指南要点百度移动优化指南夸大简便域名服务器稳固HTML5顺应性呆板可
相关文章
推荐文章
发表评论
0评