C++——string类
前言:哈喽小伙伴们,从这篇文章开始我们将进行若干个C++中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。
目录
一.什么是string类
二.string类常见接口
1.string类对象的常见构造
2.string类对象的容量操作
3. string类对象的访问及遍历操作
4.string类对象的修改操作
总结
一.什么是string类
C语言中,字符串是以'\0'结尾的一些字符的集合,为了操作方便,C标准库中提供了一些str系列的库函数,但是这些库函数与字符串是分离开的,其操作也并不能完全满足用户的期望。
而在C++的标准库中,默认存在一个string类,并且该类拥有很多的成员函数,来帮助我们更加方便的完成对字符串的一系列操作。
使用string类,需要包含头文件#include<string>。
二.string类常见接口
1.string类对象的常见构造
对于如何得到一个string类型的对象,有以下几种常见构造:
- string() 构造空的string类对象,即空字符串
- string(const char* s) 构造一个string类对象,其内容为s
- string(size_t n,char c) 构造一个string类对象,其内容为n个c字符
- string(const string&s) 拷贝构造函数,拷贝s字符串内容
实践代码如下:
#include<string>
#include<iostream>
using namespace std;int main()
{string s0;string s1("hello world!");string s2(5,'c');string s3(s1);cout << s0 << endl;cout << s1 << endl;cout << s2 << endl;cout << s3 << endl;
}
结果如下:
其中s0为空字符串,所以第一行即为空。
2.string类对象的容量操作
如何得到string类对象的信息以及对对象的操作,有如下方法:
- size 返回字符串有效字符长度
- length 返回字符串有效字符长度
- capacity 返回空间总大小
- empty 检测字符串释放为空串,是返回true,否则返回false
- clear 清空有效字符
- reserve 为字符串预留空间**
- resize 将有效字符的个数该成n个,多出的空间用字符c填充
测试如下:
#include<string>
#include<iostream>
using namespace std;int main()
{string s1("hello world!");s1.reserve(20);cout << s1.size() << endl;cout << s1.length() << endl;cout << s1.capacity() << endl;cout << s1.empty() << endl;s1.clear();cout << s1.empty() << endl;s1.resize(10, 'x');cout << s1 << endl;return 0;
}
结果如下:
值得注意的是:
1. size()与length()方法底层实现原理完全相同,引入size()的原因是为了与其他容器的接口保持一致,一般情况下基本都是用size()。
2. clear()只是将string中有效字符清空,不改变底层空间大小。
3.reserve(size_t res_arg=0):为string预留空间,不改变有效元素个数,当reserve的参数小于string的底层空间总大小时,reserver不会改变容量大小。
3. string类对象的访问及遍历操作
如何对一个string类对象进行遍历操作,有如下方法:
- operator[] 返回pos位置的字符,const string类对象调用
- 范围for C++11支持更简洁的范围for的新遍历方式
- 迭代器iterator
operator[]是对[]运算符的重载,实现数组下标的运算功能:
int main()
{string s1("hello world!");for (size_t i = 0; i < s1.size(); i++){cout << s1[i] << ' ';}return 0;
}
范围for在前边的文章中已经介绍过了:
int main()
{string s1("hello world!");for (char e : s1){cout << e << ' ';}return 0;
}
可以认为是直接用一个临时变量e去一一访问s1字符串的字符。
迭代器的作用是创建一个新的对象,可以遍历并选择序列中的一个对象,其关键字为iterator。
迭代器包含有若干方法,常用的有:
begin 获取一个字符串的首位字符
end 获取一个字符串的最后一个字符的下一个字符
用迭代器遍历字符串的方法为:
int main()
{string s1("hello world!");string::iterator it1 = s1.begin();while (it1 != s1.end()){cout << *it1 << ' ';it1++;}return 0;
}
这种方法,很类似于指针,但又与指针有很大不同,本文不做过多解释。
结果如下:
除此之外迭代器还可以反向遍历,需要关键字reverse_iterator,同时方法:
rbegin 获取一个字符串的最后一个字符的下一个字符
rend 获取一个字符串的首位符
int main()
{string s1("hello world!");string::reverse_iterator it1 = s1.rbegin();while (it1 != s1.rend()){cout << *it1 << ' ';it1++;}return 0;
}
结果如下:
4.string类对象的修改操作
如何对一个string类对象进行各种修改操作,有如下方法:
- push_back 在字符串后尾插字符c
- append 在字符串后追加一个字符串
- operator+= 在字符串后追加字符串str
- c_str 将C++格式的字符串转化为C语言格式的字符串
- find + npos 从字符串pos位置开始往后找字符c,返回该字符在字符串中的位置
- rfind 从字符串pos位置开始往前找字符c,返回该字符在字符串中的位置
- substr 在str中从pos位置开始,截取n个字符,然后将其返回
对于c_str,在C语言格式下的字符串,其末尾都会有一个‘\0’用来统计该字符串的长度,而C++格式下的string字符串由于会有size方法来表示字符串长度,所以其字符串结尾不会有‘\0’。
使用案例如下:
int main()
{string s1 = "hello world";s1.push_back('!');cout << s1 << endl;s1.append(" hello");cout << s1 << endl;s1 += " C++";cout << s1 << endl;size_t pos1 = s1.find(' ');//从前往后找到s1中的' '字符并返回其下标位置if (pos1 != 'npos'){cout << s1.substr(pos1) << endl;//从pos位置开始截取字符}size_t pos2 = s1.rfind(' ');//从后往前找到s1中的' '字符并返回其下标位置if (pos1 != 'npos'){cout << s1.substr(pos2) << endl;//从pos位置开始截取字符}return 0;
}
结果如下:
总结
关于string类的用法到这里就分享完啦。
下篇文章将对string类各接口方法进行模拟实现讲解,敬请期待!
最后希望能留下您的一键三连,我们下期再见!
相关文章:

C++——string类
前言:哈喽小伙伴们,从这篇文章开始我们将进行若干个C中的重要的类容器的学习。本篇文章将讲解第一个类容器——string。 目录 一.什么是string类 二.string类常见接口 1.string类对象的常见构造 2.string类对象的容量操作 3. string类对象的访问及遍…...

进制转换md5绕过 [安洵杯 2019]easy_web1
打开题目 在查看url的时候得到了一串类似编码的东西,源码那里也是一堆base64,但是转换成图片就是网页上我们看见的那个表情包 ?imgTXpVek5UTTFNbVUzTURabE5qYz0&cmd 我们可以先试把前面的img那串解码了 解码的时候发现长度不够,那我们…...

.kat6.l6st6r勒索病毒的最新威胁:如何恢复您的数据?
导言: 在当今数字化时代,数据安全变得至关重要。然而,随着网络威胁不断增加,勒索病毒已成为企业和个人面临的严重威胁之一。其中,.kat6.l6st6r勒索病毒是最新的变种之一,它能够加密您的数据文件࿰…...

Day 6.有名信号量(信号灯)、网络的相关概念和发端
有名信号量 1.创建: semget int semget(key_t key, int nsems, int semflg); 功能:创建一组信号量 参数:key:IPC对像的名字 nsems:信号量的数量 semflg:IPC_CREAT 返回值:成功返回信号量ID…...

MySQL 常用优化方式
MySQL 常用优化方式 sql 书写顺序与执行顺序SQL设计优化使用索引避免索引失效分析慢查询合理使用子查询和临时表列相关使用 日常SQL优化场景limit语句隐式类型转换嵌套子查询混合排序查询重写 sql 书写顺序与执行顺序 (7) SELECT (8) DISTINCT <select_list> (1) FROM &…...

算法刷题day22:双指针
目录 引言概念一、牛的学术圈I二、最长连续不重复序列三、数组元素的目标和四、判断子序列五、日志统计六、统计子矩阵 引言 关于这个双指针算法,主要是用来处理枚举子区间的事,时间复杂度从 O ( N 2 ) O(N^2) O(N2) 降为 O ( N ) O(N) O(N) …...
山人求道篇:八、模型的偏差与交易认知
原文引用https://mp.weixin.qq.com/s/xvxatVseHK62U7aUXS1B4g “ CTA策略一波亏完全年,除了交易执行错误导致的以外,这类策略都是多因子策略,一般会用机器学习组合多因子得出一个信号来进行交易。规则型策略几乎不会出现一波做反亏完全年的情况。这是有以下几个原因的: 多…...

MySQL 元数据锁及问题排查(Metadata Locks MDL)
"元数据"是用来描述数据对象定义的,而元数据锁(Metadata Lock MDL)即是加在这些定义上。通常我们认为非锁定一致性读(简单select)是不加锁的,这个是基于表内数据层面,其依然会对表的元…...
JS中的函数
1、函数形参的默认值 JavaScript函数有一个特别的地方,无论在函数定义中声明了多少形参,都可以传入任意数量的参数,也可以在定义函数时添加针对参数数量的处理逻辑,当已定义的形参无对应的传入参数时,为其指定一个默认…...
微信小程序开发常用的布局
在微信小程序开发中,常用的布局主要包括以下几种: Flex 布局:Flex 布局是一种弹性盒子布局,通过设置容器的属性来实现灵活的布局方式。它可以在水平或垂直方向上对子元素进行对齐、排列和分布。Flex 布局非常适用于创建响应式布局…...
Effective C++ 学习笔记 条款10 令operator=返回一个reference to *this
关于赋值,有趣的是你可以把它们写成连锁形式: int x, y, z; x y z 15; // 赋值连锁形式同样有趣的是,赋值采用右结合律,所以上述连锁赋值被解析为: x (y (z 15));这里15先被赋值给z,然后其结果&…...

算法简单试题
一、选择题 01.一个算法应该是( B ). A.程序 B.问题求解步骤的描述 C.要满足五个基本特性 D.A和C 02.某算法的时间复杂度为O(n),则表示该…...

CSS 自测题 -- 用 flex 布局绘制骰子(一、二、三【含斜三点】、四、五、六点)
一点 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>css flex布局-画骰子</title><sty…...
蓝桥集训之牛的学术圈 I
蓝桥集训之牛的学术圈 I 核心思想:二分 确定指数x后 判断当前c[i]是否>x(满足条件) 并记录次数同时记录 1后满足条件的个数最后取bns和m的最小值 为满足条件的元素个数ansbns为当前指数x下 满足条件的元素个数 #include <iostream>#include <cstring…...
软件设计师软考题目解析21 --每日五题
想说的话:要准备软考了。0.0,其实我是不想考的,但是吧,由于本人已经学完所有知识了,只是被学校的课程给锁在那里了,不然早找工作去了。寻思着反正也无聊,就考个证玩玩。 本人github地址…...
python读写json文件详解
在Python中,可以使用json模块来读写JSON格式的文件。下面是一个详细的示例,演示了如何读写JSON文件: import json# 写入JSON文件 data {"name": "John","age": 30,"city": "New York" }…...

#include<ros/ros.h>头文件报错
快捷键 ctrl shift B 调用编译,选择:catkin_make:build)(要先在vscode上添加扩展:ros) 可以点击配置设置为默认,修改.vscode/tasks.json 文件 修改.vscode/tasks.json 文件,否则ros.h头文件会报错 内容修改为以下内…...

mybatis单表curd笔记(尚硅谷
Mybatis 11111ibatis和mybatis不同 查询文档mybatis的日志输出id赋值输入(向sql语句传入数据单个简单类型单个实体对象多个简单类型map类型 输出数据的指定单个简单类型单个实体类型输出map类型输出list输出类型主键回显(自增长类型主键回显(…...
在线重定义-操作步骤
第一步:验证表是否能被在线重定义 验证是否能按主键重定义(默认,最后一次参数可以不加) 1 2 3 4 begin --dbms_redefinition.can_redef_table(scott,tb_cablecheck_equipment_bak); dbms_redefinition.can_redef_table(scot…...

16:00面试,16:06就出来了,问的问题过于变态了。。。
从小厂出来,没想到在另一家公司又寄了。 到这家公司开始上班,加班是每天必不可少的,看在钱给的比较多的份上,就不太计较了。没想到2月一纸通知,所有人不准加班,加班费不仅没有了,薪资还要降40%…...

微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
AtCoder 第409场初级竞赛 A~E题解
A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...
Java - Mysql数据类型对应
Mysql数据类型java数据类型备注整型INT/INTEGERint / java.lang.Integer–BIGINTlong/java.lang.Long–––浮点型FLOATfloat/java.lang.FloatDOUBLEdouble/java.lang.Double–DECIMAL/NUMERICjava.math.BigDecimal字符串型CHARjava.lang.String固定长度字符串VARCHARjava.lang…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

智能仓储的未来:自动化、AI与数据分析如何重塑物流中心
当仓库学会“思考”,物流的终极形态正在诞生 想象这样的场景: 凌晨3点,某物流中心灯火通明却空无一人。AGV机器人集群根据实时订单动态规划路径;AI视觉系统在0.1秒内扫描包裹信息;数字孪生平台正模拟次日峰值流量压力…...
Rapidio门铃消息FIFO溢出机制
关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系,以下是深入解析: 门铃FIFO溢出的本质 在RapidIO系统中,门铃消息FIFO是硬件控制器内部的缓冲区,用于临时存储接收到的门铃消息(Doorbell Message)。…...

使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...