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) 的相关文章

  • 使用 gcc 在 Linux 上运行线程构建块 (Intel TBB)

    我正在尝试为线程构建块构建一些测试 不幸的是 我无法配置 tbb 库 链接器找不到库 tbb 我尝试在 bin 目录中运行脚本 但这没有帮助 我什至尝试将库文件移动到 usr local lib 但这又失败了 任何的意见都将会有帮助 确定您
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 没有特殊字符的密码验证器

    我是 RegEx 的新手 已经进行了大量搜索 但没有找到任何具体内容 我正在编写一个验证密码字符串的正则表达式 可接受的字符串必须至少具有 4 种字符类型中的 3 种 数字 小写字母 大写字母 特殊字符 我对包含有一个想法 也就是说 如果这
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • std::vector 与 std::stack

    有什么区别std vector and std stack 显然 向量可以删除集合中的项目 尽管比列表慢得多 而堆栈被构建为仅后进先出的集合 然而 堆栈对于最终物品操作是否更快 它是链表还是动态重新分配的数组 我找不到关于堆栈的太多信息 但
  • 传递给函数时多维数组的指针类型是什么? [复制]

    这个问题在这里已经有答案了 我在大学课堂上学习了 C 语言和指针 除了多维数组和指针之间的相似性之外 我认为我已经很好地掌握了这个概念 我认为由于所有数组 甚至多维 都存储在连续内存中 因此您可以安全地将其转换为int 假设给定的数组是in
  • 无限循环与无限递归。两者都是未定义的吗?

    无副作用的无限循环是未定义的行为 看here https coliru stacked crooked com view id 24e0a58778f67cd4举个例子参考参数 https en cppreference com w cpp
  • 用于 FTP 的文件系统观察器

    我怎样才能实现FileSystemWatcherFTP 位置 在 C 中 这个想法是 每当 FTP 位置添加任何内容时 我都希望将其复制到我的本地计算机 任何想法都会有所帮助 这是我之前问题的后续使用 NET 进行选择性 FTP 下载 ht
  • 方程“a + bx = c + dy”的积分解

    在等式中a bx c dy 所有变量都是整数 a b c and d是已知的 我如何找到整体解决方案x and y 如果我的想法是正确的 将会有无限多个解 由最小公倍数分隔b and d 但我只需要一个解决方案 我可以计算其余的 这是一个例
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • 两个静态变量同名(两个不同的文件),并在任何其他文件中 extern 其中一个

    在一个文件中将变量声明为 static 并在另一个文件中进行 extern 声明 我认为这会在链接时出现错误 因为 extern 变量不会在任何对象中看到 因为在其他文件中声明的变量带有限定符 static 但不知何故 链接器 瑞萨 没有显
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 如何在当前 Visual Studio 主机内的 Visual Studio 扩展中调试使用 Roslyn 编译的代码?

    我有一个 Visual Studio 扩展 它使用 Roslyn 获取当前打开的解决方案中的项目 编译它并从中运行方法 程序员可以修改该项目 我已从当前 VisualStudioWorkspace 成功编译了 Visual Studio 扩
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • C# 使用“?” if else 语句设置值这叫什么

    嘿 我刚刚看到以下声明 return name null name NA 我只是想知道这在 NET 中叫什么 是吗 代表即然后执行此操作 这是一个俗称的 条件运算符 三元运算符 http en wikipedia org wiki Tern

随机推荐

  • 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