当前位置: 首页 > news >正文

Cpp学习——string(2)

 

目录

​编辑

容器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一样,但是顺序是从后往前找。

相关文章:

Cpp学习——string(2)

目录 ​编辑 容器string中的一些函数 1.capacity() 2.reserve() 3.resize() 4.push_back()与append() 5.find系列函数 容器string中的一些函数 1.capacity() capacity是string当中表示容量大小的函数。但是string开空间时是如何开的呢&#xff1f;现在就来看一下。先写…...

python进阶编程

lambda匿名函数 python使用lambda表达式来创建匿名函数 语法 // lambda 参数们&#xff1a;对参数的处理 lambda x : 2 * x // x 是参数&#xff0c; 2*x 是返回值 ​ //使用lambda实现求和 sum lambda arg1, arg2 : agr1 arg2 print(sum(10,20)) ​ // 将匿名函数封装在一…...

算法练习--leetcode 链表

文章目录 合并两个有序链表删除排序链表中的重复元素 1删除排序链表中的重复元素 2环形链表1环形链表2相交链表反转链表 合并两个有序链表 将两个升序链表合并为一个新的 升序 链表并返回。 新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&…...

Android性能优化—Apk瘦身优化

随着业务迭代&#xff0c;apk体积逐渐变大。项目中积累的无用资源&#xff0c;未压缩的图片资源等&#xff0c;都为apk带来了不必要的体积 增加。而APK 的大小会影响应用加载速度、使用的内存量以及消耗的电量。在讨论如何缩减应用的大小之前&#xff0c;有必要了解下应用 APK …...

前端主题切换方案——CSS变量

前言 主题切换是前端开发中老生常谈的问题&#xff0c;本文将介绍主流的前端主题切换实现方案——CSS变量 CSS变量 简介 编写CSS样式时&#xff0c;为了避免代码冗余&#xff0c;降低维护成本&#xff0c;一些CSS预编译工具&#xff08;Sass/Less/Stylus&#xff09;等都支…...

Java8 list多属性去重

大家好&#xff0c;我是三叔&#xff0c;很高兴这期又和大家见面了&#xff0c;一个奋斗在互联网的打工人。 在 Java 开发中&#xff0c;我们经常会面临对 List 中的对象属性去重的需求。然而&#xff0c;当需要根据多个属性来进行去重时&#xff0c;情况会稍微复杂一些。本篇…...

kafka-保证数据不重复-生产者开启幂等性和事务的作用?

1. 生产者开启幂等性为什么能去重&#xff1f; 1.1 场景 适用于消息在写入到服务器日志后&#xff0c;由于网络故障&#xff0c;生产者没有及时收到服务端的ACK消息&#xff0c;生产者误以为消息没有持久化到服务端&#xff0c;导致生产者重复发送该消息&#xff0c;造成了消…...

[AI in security]-214 网络安全威胁情报的建设

文章目录 1.什么是威胁情报2. 威胁情报3. 智能威胁情报3.1 智能威胁情报的组成3.2 整合威胁情报3.3 最佳实践4. 威胁情报的作用5.威胁情报模型6.反杀链模型7.基于TI的局部优势模型参考文献相关的研究1.什么是威胁情报 威胁情报是循证知识,包括环境、机制、指标、意义和可行性…...

Javaweb学习(2)

Javaweb学习 一、Maven1.1 Maven概述1.2 Maven简介1.3、Maven基本使用1.4、IDEA配置Maven1.6、依赖管理&依赖范围 二、MyBatis2.1 MyBatis简介2.2 Mybatis快速入门2.3、解决SQL映射文件的警告提示2.4、Mapper代理开发 三、MyBaits核心配置文件四、 配置文件的增删改查4.1 M…...

leetcode410. 分割数组的最大值 动态规划

hard:https://leetcode.cn/problems/split-array-largest-sum/ 给定一个非负整数数组 nums 和一个整数 m &#xff0c;你需要将这个数组分成 m 个非空的连续子数组。 设计一个算法使得这 m 个子数组各自和的最大值最小。 示例 1&#xff1a;输入&#xff1a;nums [7,2,5,1…...

C函数指针与类型定义

#include <stdio.h> #define PI 3.14 typedef int uint32_t; /* pfun is a pointer and its type is void (*)(void) */ void (*pfun)(void); /* afer typedef like this we can use “pfun1” as a data type to a function that has form like&#xff1a; / -------…...

最新2024届【海康威视】内推码【GTK3B6】

最新2024届【海康威视】内推码【GTK3B6】 【内推码使用方法】 1.请学弟学妹们登录校招官网&#xff0c;选择岗位投递简历&#xff1b; 2.投递过程中填写内推码完成内推步骤&#xff0c;即可获得内推特权。 内推码&#xff1a;GTK3B6 内推码&#xff1a;GTK3B6 内推码&…...

边写代码边学习之LSTM

1. 什么是LSTM 长短期记忆网络 LSTM&#xff08;long short-term memory&#xff09;是 RNN 的一种变体&#xff0c;其核心概念在于细胞状态以及“门”结构。细胞状态相当于信息传输的路径&#xff0c;让信息能在序列连中传递下去。你可以将其看作网络的“记忆”。理论上讲&a…...

Elasticsearch8.8.0 SpringBoot实战操作各种案例(索引操作、聚合、复杂查询、嵌套等)

Elasticsearch8.8.0 全网最新版教程 从入门到精通 通俗易懂 配置项目 引入依赖 <dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.16</version></dependency><dependency>&l…...

《MySQL高级篇》十五、其他数据库日志

文章目录 1. MySQL支持的日志1.1 日志类型1.2 日志的弊端 2. 慢查询日志(slow query log)3. 通用查询日志3.1 问题场景3.2 查看当前状态3.3 启动日志3.4 查看日志3.5 停止日志3.6 删除\刷新日志 4. 错误日志(error log)4.1 启动日志4.2 查看日志4.3 删除\刷新日志4.4 MySQL8.0新…...

【Linux】【预】配置虚拟机的桥接网卡+nfs

【Linux】【预】配置虚拟机的桥接网卡 1. 配置VM虚拟机的桥接网络2 配置Win10中的设置3.配置Linux中的IP4. 串口连接开发板&#xff0c;配置nfs5 修改网络文件6 验证nfs 是否成功总结 1. 配置VM虚拟机的桥接网络 右击设置&#xff0c;选择添加网络&#xff0c;按照如下顺序操作…...

【Android】Retrofit2和RxJava2新手快速上手

写这篇博客的目的 网上关于Retrofit2和RxJava2的博客特别多&#xff0c;但是内容特别复杂&#xff0c;一上来就讲解很高级的用法 其实我们没必要像高考做题家一样&#xff0c;把每个API都背的滚瓜烂熟 熟悉基本用法&#xff0c;高阶用法需要的时候再逐个了解就行了 因为博客…...

1.4 Nacos注册中心

目录 什么是Nacos Nacos下载和安装 下载和安装 启动 Nacos服务注册与发现 Nacos的服务分级存储模型 什么是分级存储模型 配置实例集群 配置同集群优先的负载均衡 权重配置 点击编辑按钮 配置所需的权重 环境隔离 创建namespace 什么是Nacos Nacoshttps://nacos.i…...

AOJ 2200 Mr. Rito Post Office 最短路径+动态规划+谨慎+思维

我写了好多注释&#xff0c;一看就能看懂&#xff0c;这个题目我想了6&#xff0c;7个小时&#xff0c;一开始忽略了船的位置和要把船安置的位置一致的情况&#xff0c;补上就对了。 #include <iostream> using namespace std; int inf 0x3f3f3f3f, num[1007], dp[1007…...

红米电视 ADB 安装 app 报错 failed to authenticate xxx:5555

开启电视开发者模式&#xff0c;允许安装未知来源应用及开启 ADB 调试电脑端下载 adb 工具 点击下载同一局域网的电脑使用 adb 工具连接&#xff08;提前查看电视 IP&#xff09;D:\adb>adb connect 192.168.1.7 * daemon not running; starting now at tcp:5037 * daemon s…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

Python:操作 Excel 折叠

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

Swift 协议扩展精进之路:解决 CoreData 托管实体子类的类型不匹配问题(下)

概述 在 Swift 开发语言中&#xff0c;各位秃头小码农们可以充分利用语法本身所带来的便利去劈荆斩棘。我们还可以恣意利用泛型、协议关联类型和协议扩展来进一步简化和优化我们复杂的代码需求。 不过&#xff0c;在涉及到多个子类派生于基类进行多态模拟的场景下&#xff0c;…...

高频面试之3Zookeeper

高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个&#xff1f;3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制&#xff08;过半机制&#xff0…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

三分算法与DeepSeek辅助证明是单峰函数

前置 单峰函数有唯一的最大值&#xff0c;最大值左侧的数值严格单调递增&#xff0c;最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值&#xff0c;最小值左侧的数值严格单调递减&#xff0c;最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...

Golang——9、反射和文件操作

反射和文件操作 1、反射1.1、reflect.TypeOf()获取任意值的类型对象1.2、reflect.ValueOf()1.3、结构体反射 2、文件操作2.1、os.Open()打开文件2.2、方式一&#xff1a;使用Read()读取文件2.3、方式二&#xff1a;bufio读取文件2.4、方式三&#xff1a;os.ReadFile读取2.5、写…...

Docker拉取MySQL后数据库连接失败的解决方案

在使用Docker部署MySQL时&#xff0c;拉取并启动容器后&#xff0c;有时可能会遇到数据库连接失败的问题。这种问题可能由多种原因导致&#xff0c;包括配置错误、网络设置问题、权限问题等。本文将分析可能的原因&#xff0c;并提供解决方案。 一、确认MySQL容器的运行状态 …...

消息队列系统设计与实践全解析

文章目录 &#x1f680; 消息队列系统设计与实践全解析&#x1f50d; 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡&#x1f4a1; 权衡决策框架 1.3 运维复杂度评估&#x1f527; 运维成本降低策略 &#x1f3d7;️ 二、典型架构设计2.1 分布式事务最终一致…...