Cpp学习——string(2)

2023-11-07

 

目录

​编辑

容器string中的一些函数

1.capacity()

2.reserve() 

3.resize()

4.push_back()与append()

5.find系列函数


容器string中的一些函数

1.capacity()

capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢?现在就来看一下。先写这样一段程序:

int main()
{
	string s ;
	int old = s.capacity();
	cout << "原来的容量:"<<old << endl;
	for (int i = 0;i < 100;i++)
	{
		s += 'c';
		if (s.capacity() != old)
		{
			cout << "扩容:" << s.capacity() << endl;
			old = s.capacity();
		}
	}
	return 0;
}

结果:

在这里可以看到除了第一次扩容以后,其它的扩容都是1.5倍扩容。可以说在vs环境下string扩容都是1.5倍扩容。但是为什么第一次扩容不是1.5倍扩容呢?这是因为在vs中要处理一些内存对齐的问题。所以,第一次扩容才不是1.5倍扩容。 

2.reserve() 

我们都知道,扩容是一件非常耗效率的事情。所以在程序中我们总是要去避免掉扩容。那我们有什么好办法去防止扩容呢?这还真有办法,就是使用reserve()函数。但是这个办法要在你知道大概要开多少空间的情况下使用。比如上面的程序,我知道要开一百个字节的空间。所以我就这样操作:

int main()
{
	string s ;
	int old = s.capacity();
	cout << "原来的容量:"<<old << endl;
	s.reserve(100);//预开一百个字节的空间
	for (int i = 0;i < 100;i++)
	{
		s += 'c';
		if (s.capacity() != old)
		{
			cout << "扩容:" << s.capacity() << endl;
			old = s.capacity();
		}
	}
	return 0;
}

结果:

 这样便有效的避免了多次扩容。

这里要注意的一点是,reverse()函数是不能够缩小空间的

3.resize()

 resize()函数相当于是reserve()加上初始化。resize()函数有两种形式:1.resize(size),2.resize(size,char)。第一种形式的参数只有要开的长度,于是resize()会默认初始化开辟的空间里的数据为'\0'。第二种形式要传的参数便是要开辟的空间的大小与初始化这段空间的值。并且这个函数会自动扩容。如下列程序:

string s ;
s.resize(100);
cout << s << endl;
return 0;

结果:

这时因为'\0'不会显示出来。

再比如下列程序:

string s ;
s.resize(100,'c');
cout << s << endl;
return 0;

结果:

 

4.push_back()与append()

push_back()函数是干嘛的相信大家都懂。这个函数实现的便是一个尾插的功能,实现的就是一个一个字符的尾插。比如我要将x插入到s中:

 

string s ;
s.resize(3,'c');
s.push_back('x');
cout << s << endl;
return 0;

结果:

但是如果我要插入字符串xxxxx呢?这时push_back()可解决不了了。此时就得append()上场了:

string s ;
s.resize(3,'c');
s.append("xxxxx");
cout << s << endl;
return 0;

结果:

 

5.find系列函数

 find(char*/char):这个函数实现的功能是从字符串的头往尾找。找到了要找的字符串便返回字符所在的下标。比如我要找一个.cpp文件的后缀:

int main()
{
	string s = "text.cpp";
	int i = s.find('.');
	cout << s.substr(i) << endl;
}

结果:

成功找到。

但是,如果现在我要找的是text.cpp.zip的文件后缀呢?此时就得rfind()上场了,rfind(char*/char) :

这个函数实现的功能是和find()函数相反的。它实现的功能是从后往前查找字符,找到字符后也是返回字符所在下标。对于找text.cpp.zip文件的后缀,代码如下:

int main()
{
	string s = "text.cpp.zip";
	int i = s.rfind('.');
	cout << s.substr(i) << endl;
}

结果:

再比如说我要找到一个网址的协议,域名,资源名该怎么找呢?比如这个网址:

 

https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217

这个网址的协议是:https

域名是:mp.csdn.net

资源是:/mp_blog/creation/editor?spm=1011.2415.3001.6217

我们该怎么办呢?其实挺简单的,代码如下:

string s = "https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217";
	int begin = 0;
	int end = 0;

	end = s.find(":");
	cout << "协议:"<<s.substr(begin, end) << endl;

	begin = end + 3;
	end = s.find("/",begin);
	cout <<"域名:"<< s.substr(begin, end) << endl;

	cout << "资源名:"<<s.substr(end) << endl;

关键是要调整寻找的范围。比如第一次找到协议以后,便跳过协议和"//"到后面去找。

find_first_of(char*/char):这个函数能实现找到要找的字符串里的任何一个字符并返回该字符的下标。如:

string s = "https://mp.csdn.net/mp_blog/creation/editor?spm=1011.2415.3001.6217";
	cout <<"修改前:"<< s << endl;
	std::size_t found = s.find_first_of("aeiou");
	
	while (found != std::string::npos)
	{
		s[found] = '*';
		found = s.find_first_of("aeiou", found + 1);
	}
	cout <<"修改后:"<< s << endl;

find_last_of(char*/char):功能与find_firsy_of一样,但是顺序是从后往前找。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Cpp学习——string(2) 的相关文章

  • c# - 显示小数点到小数点后 6 位 [重复]

    这个问题在这里已经有答案了 可能的重复 具有 N 个小数位的 Double ToString https stackoverflow com questions 3059759 double tostring with n number o
  • 如何将不记名令牌发送到 ASP NET MVC 5 中的视图?

    我有一个 NET MVC and WEB API项目 我想打电话给WEB API controllers来自 javascript 但我没有找到将令牌发送到我的视图的方法 我想添加bearer token in Viewbag变量 使用以下
  • 在 C# 中轻松创建支持索引的属性

    在 C 中我发现索引属性 http msdn microsoft com en us library aa288464 VS 71 aspx非常有用 例如 var myObj new MyClass myObj 42 hello Conso
  • C++ 和序列化:有什么方法可以进行某种内省吗?

    我读过一些例子维基百科 http en wikipedia org wiki Type introspection C 2B 2B但我正在寻找一些现实生活中的例子 如何使用内省 为什么 它有助于编写干净的代码 以及代码本身 例如 有没有办法
  • 可变数量的(常量)引用参数

    我试图从我的高级代码 使用 C 11 中消除原始指针 并且我找到了引用 尤其是const 在许多情况下 当没有所有权转移时 是一个很好的替代品 但如果有的话该怎么办variable我想通过 常量 引用传递的参数数量 你不能创建一个std v
  • 计算复杂数组的abs()值的最快方法

    我想计算 C 或 C 中复杂数组元素的绝对值 最简单的方法是 for int i 0 i lt N i b i cabs a i 但对于大向量来说 速度会很慢 有没有办法加快速度 例如使用并行化 语言可以是 C 或 C 鉴于所有循环迭代都是
  • 修剪 UIImage 边框

    这是我想要修剪的图像的示例 我想去掉图像周围的边框 在本例中是顶部和底部的黑条 我在Github上找到了一个库 CKImageAdditions https github com cmkilger CKImageAdditions 但是它似
  • 如何从Web JavaScript应用程序获取桌面C#程序中的变量

    我遇到一个问题 有两个应用程序 一种是 C 中的桌面应用程序 另一种是 javascript 中的 Web 应用程序 运行桌面应用程序中的一些变量或信息需要传输到Web应用程序 有谁知道如何解决这个问题 有人愿意提供更多细节来解决这个问题吗
  • Identity Server 4:添加访问令牌的声明

    我正在使用 Identity Server 4 和隐式流 并且想要向访问令牌添加一些声明 新的声明或属性是 tenantId 和 langId 我已将 langId 添加为我的范围之一 如下所示 然后通过身份服务器请求 但我也获得了tena
  • 我可以在 C++ 中重写非虚函数吗

    我想知道我可以重写 C 中的非虚函数吗 因为我在使用 C 时发现了这个问题override关键字我的代码如下 class A public void say cout lt lt From A n class B public A publ
  • 为什么我无法调试动态加载的程序集?

    我正在开发一个 Web API 项目 该项目使用内部模拟框架 允许拦截和修改来自控制器的响应 它使用 MEF 加载包含某些先决条件匹配时执行的代码的程序集 我知道这是正常工作的 因为我可以在响应中看到模拟已被执行 但由于某种原因我无法调试动
  • 我可以对(非成员)函数使用部分模板特化吗?

    我试图在 非成员 函数上使用部分模板专业化 但我在语法上遇到了问题 我在 StackOverflow 中搜索了其他部分模板专业化问题 但这些问题涉及类或成员函数模板的部分专业化 作为起点 我有 struct RGBA RGBA uint8
  • Request.Form 和 Request.QueryString 之间的区别?

    有人可以告诉我两者之间的确切区别吗Request Form and Request QueryString 我知道一个区别 比如 如果HTTP请求方式为POST 则用户提交的数据在申请表 收藏 如果HTTP请求方法是GET 则用户提交的数据
  • #define 内存地址声明

    这个 define 语句有什么作用 它用于定义内存地址 但我不明白 uint32 t 部分 define GPxDAT uint32 t 0x6FC0 通常用于访问映射到地址空间的硬件寄存器 或者一些特定的内存地址 硬件寄存器应定义为vol
  • 使用非字符串作为字符串(而不是自动使用 ToString)时如何显示错误?

    建议的重复确实是一个类似的问题 然而 答案只涵盖一种选择 禁用 ToString 本身 还有其他可能的解决方案 例如让 Visual Studio 警告我 或者不调用 ToString 仔细阅读那里的答案 他认为is调用 只是解释说没有办法
  • Gridview 错误:对 Bind 的调用格式不正确

    我有以下 gridview 代码
  • C# 3.0 中自动属性和公共字段的区别

    我无法理解为什么 C 3 0 中存在自动实现的属性语言功能 当你说的时候有什么区别 public string FirstName than public string FirstName get set 因为它们在生成的 IL 代码 和机
  • 用于 nmap 输出的 C++ xml 解析器

    我是 nmap 的新手 我在 nmap 教程中看到 https nmap org book man output html https nmap org book man output html oX 选项可用于获取 xml 格式的 nma
  • DataGridView 捕获用户行选择

    我在处理选择时遇到问题DataGridView 我的网格视图包含一个金额列 表单上有一个文本框 应显示所选网格视图行的总数 因此 我需要在用户选择 取消选择 gridview 行时捕获事件并相应地计算 添加 减去 金额 我找到了两种方法 使
  • C#:如何处理乱序 TCP 数据包?

    请有人解释一下如何处理乱序数据包 我使用原始套接字来捕获数据包 并在数据包到来时解析它们 但其中一些数据包的顺序错误 例如 ID 标志 16390 PSH ACK 16535 PSH ACK 16638 确认 16640 PSH ACK 1

随机推荐

  • C# 线程暂停和恢复

    文章目录 前言 一 暂停与恢复 二 功能实现 1 按钮事件 播放和停止 2 线程和ManualResetEvent 总结 前言 因为需要一个自动播放和暂停图片的功能 所以就非常自然想到了创建一个线程 用点击事件控制线程的暂停和启动 一 暂停
  • [Windows驱动开发](四)内存管理

    一 内存管理概念 1 物理内存概念 Physical Memory Address PC上有三条总线 分别是数据总线 地址总线和控制总线 32位CPU的寻址能力为4GB 2的32次方 个字节 用户最多可以使用4GB的真实物理内存 PC中很多
  • PyTorch简介

    PyTorch是一个针对深度学习 并且使用GPU和CPU来优化的tensor library 张量库 最新发布的稳定版本为1 9 源码在https github com pytorch pytorch 它支持在Linux Mac和Windo
  • kafka启动失败,报错java.lang.NoSuchMethodError

    ERROR KafkaServer id 1 Fatal error during KafkaServer startup Prepare to shutdown kafka server KafkaServer java lang NoS
  • Java迭代器和Collection接口

    各位小伙伴们大家好 欢迎来到这个小扎扎的 Java核心技术 卷 笔记专栏 在这个系列专栏中我将记录浅学这本书所得收获 鉴于 看到就是学到 学到就是赚到 精神 这波简直就是血赚 涉及的知识点速通 关于迭代器你都知道什么 什么是迭代器 迭代器的
  • 机智云GoKit3点灯教程(基于正点原子的代码风格)

    首先的首先 吐槽一波机智云的教程 官方的教程总是让下它那个微信宠物屋的代码 一步看结果 拜托 就不能来个一步一步地教程吗 还有那个宠物屋的代码看得很头痛啊 总而言之 官方的教程给我的感觉就是很凌乱 按习惯 拿到板子先点个灯 下面就来一步一步
  • java tomcat get url地址长度如何设置_解决Springboot get请求是参数过长的情况

    问题原因 Springboot get请求是参数过长抛出异常 Request header is too large 的问题 错误描述 java lang IllegalArgumentException Request header is
  • sonarQube10.0代码审计软件安装(一)

    sonarQube10 0代码审计软件安装 一 下载地址 官网 可能需要科学上网一下 安装教程 选择Try out SonarQube 页面中即可发现Installing a local instance of SonarQube 下方即为
  • linux2——GDB调试,makefile规则(比之前的深一点点)

    一 常用gdb指令一览 二 makefile 1 超简单例子 2 基本规则 在替换之前 能看懂之前 3 经过替换开始一眼看不懂 4 但是即便经过3的变换也无法做到 自动化扩展 比如加一个乘法函数就需要再写一个乘法的规则 因此有模式规则 o
  • Spring Bean生命周期doCreateBean源码阅读

    bean的生命周期的几个后置接口都是在这个方法里面调用 所以单独开一篇该方法的源码阅读 下面从两个点来阅读 1 何时调用 只看容器启动 2 梳理这个方法的流程 跟上一节对应上 先贴上源码 protected Object doCreateB
  • java使用ffmpeg实现视频切割

    因为公司项目的部分需求 需要将已经录制好的视频 从固定时间开始截取 到固定时间结束 并且将视频截取成相对平均的若干段视频 目前demo实现了 后续还会继续优化 在视频截取的时候 从关键帧开始或结束 1 首先需要安装FFmpeg 2 直接上代
  • mysql插入100000条记录的方法

    1 存储过程 背景 运行的环境 就是命令行界面 可以实navicat sqlyog datagrip等 截图如下 1 建表 建表 create table test id int not null primary key score int
  • Unity 开发常用功能

    从本地读取文件
  • 基于 Matlab 的贝叶斯优化 LSTM 时间序列预测

    基于 Matlab 的贝叶斯优化 LSTM 时间序列预测 时间序列预测是一项重要的任务 它可以帮助我们理解和预测各种现象和趋势 而 LSTM Long Short Term Memory 是一种强大的循环神经网络模型 特别适用于处理时间序列
  • vue首次加载白屏过渡动画(vue优化)

    过渡动画需要在index html文件里面添加 1 css 在public index css创建index css html body app height 100 margin 0px padding 0px chromeframe m
  • OpenCV自带函数实现灰度图像平移和旋转算法(平面内)

    float shift and rot test opencv cv Mat des Vector2f shift int rot float center x DIM SAMPLE POINTS X 1 2 0 float center
  • (详解)js中什么是宏任务、微任务?宏任务、微任务有哪些?又是怎么执行的?

    目录 参考资料 必看强烈建议十分钟看完视频 即可学会 必看参考详解宏任务微任务 笔记 宏任务与微任务 定时器的任务编排 promise的微任务处理逻辑 DOM渲染任务 任务队列共享内存 进度条的实现 任务拆分成多个任务 promise复杂任
  • Dyanmics CRM您无法登陆系统。原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用...

    当在操作CRM时 做任何的写操作包括创建数据 更新数据 都会提示下面截图中的错误 您无法登陆系统 原因可能是您的用户记录或所属的业务部门在Microoft Dynamics CRM中已被禁用 根据错误提示第一反应就是当前操作用户的业务部门被
  • sqlalchemy order_by降序/升序

    sqlalchemy中的query默认是按id升序进行排序的 当遇到复杂情况时就需要时用order by 下面介绍几种order by 的几种使用方法 session query User order by User create time
  • Cpp学习——string(2)

    目录 编辑 容器string中的一些函数 1 capacity 2 reserve 3 resize 4 push back 与append 5 find系列函数 容器string中的一些函数 1 capacity capacity是str