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

【C++】string简单实用详解

本片要分享的内容是有关于string的知识,在这之前得介绍一下什么是STL;

目录

1.STL简单介绍

2. string简单介绍

3.string简单使用

3.1.string的定义

3.2.字符串的拼接

3.3.string的遍历

3.3.1.循环遍历

3.3.2.迭代器遍历

4.string的函数构造


1.STL简单介绍

STL是C++标准库的重要组成部分,不仅是一个可复用的组件库,而且是一个包罗数据结构与算法的软件框架。也就是说他是C++标准库的一个子集,也就是说从今往后我们需要用到数据结构的内容时,不需要再像C语言自己定义结构,使用起来会更加便捷。

当然C++标准库中还有其他的组成部分,其中STL是最常使用的部分,所以我们需要学习它的使用。

首先了解SLT的六大组件

 六大组件中最重要的就是算法容器了,容器其实就可以理解为数据结构,包阔我们之前学的栈、队列、树等等都叫做容器,只是将数据结构换了叫法;

算法就是我们之前所学的像排序、逆置、交换等等都可以称之为算法,目前我们需要重点学习的就是容器算法和迭代器;

2. string简单介绍

严格来说string并不属于STL中,所以在STL中是找不到string的,而string属于标准库,所以当我们在容器中是找不到string的

但是我们可以在标准库中找到string 

 原因是因为string诞生的比STL早一些,但是string的用法和我们今后所学的容器非常相似,我们只要学习完string之后再学习STL容器会容易许多。

接下来观察string的描述

文档中说string是一个用字符的顺序数组实现的一个对象,也可以理解为他管理着字符的数据表;

在日常使用中很多的内容都需要用字符串来表示,比如身份证号,如果使用int表示会超出长度,而且有的人身份证号尾号是x 。

再继续观察string包括的内容

 可以看到string还包括了成员函数自己的成员函数(Member functions),还有迭代器(Iterators),还有容量(capacity)相关的内容。关于 容量方面可以说在之前学习数据结构时有所耳闻,在C语言的学习中我们常常使用数组,顺序表等结构,容量不够时需要我们自己写函数扩容;

但是在C++中我们使用的容量的内容有自扩容属性,也就是空间不够时可以自己开空间,非常好用。

接下来用代码来品一品string的用法

3.string简单使用

3.1.string的定义

如上代码我们就定义好两个字符串了,但是s1没有初始化,s2的初始化方式是拷贝构造,同时还有许多种初始化方式如下

 可以看到我们使用的是第一种定义方式无参构造,和第四种带参构造;

同样的string也支持输入和输出

 

 相比于C语言解决了输入字符导致的越界或者按需申请释放空间的问题,只要我们的内存够大,任何长度的字符串都可以输入输出。

3.2.字符串的拼接

在C++中字符串的拼接非常容易

void test_string2()
{string s1("wddniubi ");string s2("hello world");string ret = s1 + s2;cout << ret << endl;
}
int main()
{test_string2();return 0;
}

我们只需要将s1+s2即可实现字符串的拼接,键盘输入亦可

void test_string3()
{string s1;string s2;cin >> s1;cin >> s2;cout << s1 + s2 << endl;
}int main()
{test_string3();return 0;
}

玩儿法花式多样,比起C语言中的strcat简直不要爽太多哼哼啊啊啊啊啊啊啊啊啊啊;

strcat空间不够不能自行的扩容,并且需要找到'\0'再实现追加,而string完全不需要先找末尾,节省时间

3.3.string的遍历

3.3.1.循环遍历

void test_string4()
{string s1("hello world");//string遍历for (size_t i = 0; i < s1.size(); i++){cout << s1[i] ;}cout << endl;}

在上面的代码中size是capacity 的一个内部函数,是来计算字符串的大小的,相当于strlen,

可以看到遍历输出的结果;

同时我们可以通过遍历对其进行修改

void test_string4()
{string s1("hello world");//string遍历for (size_t i = 0; i < s1.size(); i++){cout << s1[i] ;}cout << endl;string遍历修改      for (size_t i = 0; i < s1.size(); i++){s1[i]++;}cout << s1;
}

 以上是我们最容易掌握的遍历方式,还有一种方式叫做迭代器

3.3.2.迭代器遍历

直接上代码简单观察

void test_string5()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){cout << *it ;it++;}cout << endl;
}

 这里要使用iterator(迭代器)来定义变量it;

 首先我们将迭代器简单理解为一个指针

 这里有三个成员变量,其中_str指向存放着这个字符串的空间;

我们在观察一下迭代器中的函数

 像begin以及下面这些都是迭代器中的成员函数,其中begain指的就是字符串开始的位置。

 那end指向的就是\0的位置;

所以我们只需要while循环中规定结束的条件,字符数组就会从字符串s1的begin的位置一直遍历到end的位置

可以看到已经通过迭代器遍历输出。

同样迭代器除了读取数据,也可以做到写入数据

void test_string5()
{string s1("hello world");string::iterator it = s1.begin();while (it != s1.end()){cout << *it ;it++;}cout << endl;it = s1.begin();while (it != s1.end()){*it='a';++it;}cout << endl;cout << s1 << endl;
}

我们将s1的内容都改成了a,结果如下

 那迭代器中还有反向迭代器的用法,比如其中的函数rbegin,用法和begin的用法一样

void test_string6()
{string s1("hello world");string::reverse_iterator rit = s1.rbegin();while (rit != s1.rend()){cout << *rit ;++rit;}cout << endl;
}

 可以看到我们的hello world反过来了

 那反向迭代器就是这样的。

 还可以使用auto来完成反向迭代器

void test_string6()
{string s1("hello world");auto rit = s1.rbegin();while (rit != s1.rend()){cout << *rit ;++rit;}cout << endl;
}

 auto会自动推导出rbegin的返回类型,rbegin的返回类型就是reverse_iterator

4.string的函数构造

说完string中一些常用的函数,我们不妨深入观察它的函数构造,先上代码观察

void test_string7()
{string s1("hello world");cout << s1 << endl;string s2(s1, 6, 5);cout << s2 << endl;string s3("helloooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo");string s4(s3, 3);cout << s4 << endl;
}

 

 可以看到string支持很多拷贝构造的方式,其中第三中有三个参数,那官方的解析如下

 可以看到第三种构造的意思就是说将字符串从第pos个位置开始拷贝len个字符,或者当没有len时会直到字符的结束,可以观察上面的测试代码,我们使用s3拷贝构造s4时,没有给出len的值,那运行结果如下

 可以看到我们直接取到了字符串s4的结尾;

同样的我们也可以使用迭代器区间初始化;

void test_string7()
{string s5(5, 'a');string s6(s5.begin(), s5.end());cout << s6 << endl;
}

这里的意思是将s5的前五个数据初始化成为a,随后再用s5的开始和结尾的数据初始化s6,结果如下

 可以看到初始化成功了。

所以string有很多初始化版本,string 的初始化就介绍到这里。

那学习string的目的是为了以后学习STL中容器更方便一些,STL中许多内容都是和string中使用方法相似的,这就是我们学习string的目的

以上就是本片索要分享的内容,如果对你有所帮助还请三连支持,感谢您的阅读。

相关文章:

【C++】string简单实用详解

本片要分享的内容是有关于string的知识&#xff0c;在这之前得介绍一下什么是STL&#xff1b; 目录 1.STL简单介绍 2. string简单介绍 3.string简单使用 3.1.string的定义 3.2.字符串的拼接 3.3.string的遍历 3.3.1.循环遍历 3.3.2.迭代器遍历 4.string的函数构造 1.…...

opencv 进阶16-基于FAST特征和BRIEF描述符的ORB(图像匹配)

在计算机视觉领域&#xff0c;从图像中提取和匹配特征的能力对于对象识别、图像拼接和相机定位等任务至关重要。实现这一目标的一种流行方法是 ORB&#xff08;Oriented FAST and Rotated Brief&#xff09;特征检测器和描述符。ORB 由 Ethan Rublee 等人开发&#xff0c;结合了…...

Unity 类Scene窗口相机控制

类Scene窗口相机控制 &#x1f354;效果 &#x1f354;效果 传送门&#x1f448;...

juc基础(三)

目录 一、读写锁 1、读写锁介绍 2、ReentrantReadWriteLock 3、例子 4、小结 二、阻塞队列 1、BlockingQueue 简介 2、BlockingQueue 核心方法 3、案例 4、常见的 BlockingQueue &#xff08;1&#xff09;ArrayBlockingQueue(常用) &#xff08;2&#xff09;Li…...

c语言函数指针和指针函数的区别,以及回调函数的使用。

函数指针是什么&#xff0c;函数指针本质也是指针&#xff0c;不过是指向函数的指针&#xff0c;存储的是函数的地址。 指针函数是什么,指针函数其实就是返回值是指针的函数&#xff0c;本质是函数。 函数指针是如何定义的呢&#xff0c;如下 void (*pfun)(int a,int b) 这…...

什么是服务端渲染?前后端分离的优点和缺点?

一.概念 服务端渲染简单点就是服务端直接返回给客户端一个完整的页面&#xff0c;也就是一个完整的html页面&#xff0c;这个页面上已经有数据了。说到这里你可能会觉得后端怎么写页面啊&#xff0c;而且服务端返回页面不是加载更慢吗&#xff1f;错了&#xff0c;因为我们现在…...

【Java】优化重复冗余代码的8种方式

文章目录 前言1. 抽取公用方法2. 抽工具类3. 反射4.泛型5. 继承与多态6.使用设计模式7.自定义注解(或者说AOP面向切面)8.函数式接口和Lambda表达式 前言 日常开发中&#xff0c;我们经常会遇到一些重复代码。大家都知道重复代码不好&#xff0c;它主要有这些缺点&#xff1a;可…...

rabbitmq卸载重新安装3.8版本

卸载之前的版本的rabbitmq 卸载rabbitmq 卸载前先停止rabbitmq服务 /usr/lib/rabbitmq/bin/rabbitmqctl stop查看rabbitmq安装的相关列表 yum list | grep rabbitmq卸载rabbitmq相关内容 yum -y remove rabbitmq-server.noarch 卸载erlang 查看erlang安装的相关列表 …...

MyBatis分页思想和特殊字符

目录 一、MyBatis分页思想 1.1 使用场景 1.2 代码演示 二、MyBatis特殊字符 2.1代码演示 一、MyBatis分页思想 1.1 使用场景 Mybatis分页应用场景&#xff1a; MyBatis是一个Java持久层框架&#xff0c;它提供了一种将SQL查询和结果映射到Java对象的简单方式。分页是MyBa…...

设计模式大白话——命令模式

命令模式 一、概述二、经典举例三、代码示例&#xff08;Go&#xff09;四、总结 一、概述 ​ 顾名思义&#xff0c;命令模式其实和现实生活中直接下命令的动作类似&#xff0c;怎么理解这个命令是理解命令模式的关键&#xff01;&#xff01;&#xff01;直接说结论是很不负责…...

[线程/C++(11)]线程池

文章目录 一、C实现线程池1. 头文件2. 测试部分 二、C11实现线程池1. 头文件2. 测试部分 一、C实现线程池 1. 头文件 #define _CRT_SECURE_NO_WARNINGS #pragma once #include<iostream> #include<string.h> #include<string> #include<pthread.h> #…...

VR防地质灾害安全教育:增强自然灾害知识,提高自我保护意识

VR防地质灾害安全教育系统是一种虚拟仿真技术&#xff0c;可以通过虚拟现实技术模拟地震、泥石流、滑坡等地质灾害的发生和应对过程&#xff0c;帮助人们提高应对突发自然灾害的能力。这种系统的优势在于可以增强自然灾害知识&#xff0c;提高自我保护意识&#xff0c;锻炼人们…...

Mybatis多对多查询案例!

在MyBatis中执行多对多查询需要使用两个主要表和一个连接表&#xff08;通常称为关联表&#xff09;来演示。在这个示例中&#xff0c;我们将使用一个示例数据库模型&#xff0c;其中有三个表&#xff1a;students、courses 和 student_courses&#xff0c;它们之间建立了多对多…...

Android OpenCV(七十五): 看看刚”转正“的条形码识别

前言 2021年,我们写过一篇《OpenCV 条码识别 Android 平台实践》,当时的条形码识别模块位于 opencv_contrib 仓库,但是 OpenCV 4.8.0 版本开始, 条形码识别模块已移动到 OpenCV 主仓库,至此我们无需自行编译即可轻松地调用条形码识别能力。 Bar code detector and decoder…...

数据结构——布隆计算器

文章目录 1.什么是布隆过滤器&#xff1f;2.布隆过滤器的原理介绍3.布隆过滤器使用场景4.通过 Java 编程手动实现布隆过滤器5.利用Google开源的 Guava中自带的布隆过滤器6.Redis 中的布隆过滤器6.1介绍6.2使用Docker安装6.3常用命令一览6.4实际使用 1.什么是布隆过滤器&#xf…...

金融学复习博迪(第6-9章)

第6章 投资项目分析 学习目的&#xff1a;解释资本预算&#xff1b;资本预算基本法则 资本预算过程包含三个基本要素&#xff1a; 一提出针对投资项目的建议 一对这些建议进行评价 一决定接受和拒绝哪些建议 6.1项目分析的特性 资本预算的过程中的基本单位是单个的投资项目。投…...

解决idea登录github copilot报错问题

试了好多方案都没用&#xff0c;但是这个有用&#xff0c; 打开idea-help-edit custonm vm options 然后在这个文件里面输入 -Dcopilot.agent.disabledtrue再打开 https://github.com/settings/copilot 把这个设置成allow&#xff0c;然后重新尝试登录copilot就行就行 解决方…...

什么是Flex布局?请列举一些Flex布局的常用属性。

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ Flex布局&#xff08;Flexible Box Layout&#xff09;⭐ Flex布局的常用属性⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之…...

React + TypeScript + antd 常见开发场景

时间戳转格式 // 获取当前时间戳&#xff08;示例&#xff09; const timestamp Date.now(); // 或者使用特定的时间戳值// 创建一个新的Date对象&#xff0c;并传入时间戳 const date new Date(timestamp);// 获取年、月、日的值 const year date.getFullYear(); const mon…...

前端基础踩坑记录

前言&#xff1a;在做vue项目时&#xff0c;有时代码没有报错&#xff0c;但运行时却各种问题&#xff0c;没有报错排查起来就很费劲&#xff0c;本人感悟&#xff1a;写前端&#xff0c;需要好的眼神&#xff01;&#xff01;&#xff01;谨以此博客记录下自己的踩坑点。 一、…...

Vim 调用外部命令学习笔记

Vim 外部命令集成完全指南 文章目录 Vim 外部命令集成完全指南核心概念理解命令语法解析语法对比 常用外部命令详解文本排序与去重文本筛选与搜索高级 grep 搜索技巧文本替换与编辑字符处理高级文本处理编程语言处理其他实用命令 范围操作示例指定行范围处理复合命令示例 实用技…...

XCTF-web-easyupload

试了试php&#xff0c;php7&#xff0c;pht&#xff0c;phtml等&#xff0c;都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接&#xff0c;得到flag...

【杂谈】-递归进化:人工智能的自我改进与监管挑战

递归进化&#xff1a;人工智能的自我改进与监管挑战 文章目录 递归进化&#xff1a;人工智能的自我改进与监管挑战1、自我改进型人工智能的崛起2、人工智能如何挑战人类监管&#xff1f;3、确保人工智能受控的策略4、人类在人工智能发展中的角色5、平衡自主性与控制力6、总结与…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

深入浅出:JavaScript 中的 `window.crypto.getRandomValues()` 方法

深入浅出&#xff1a;JavaScript 中的 window.crypto.getRandomValues() 方法 在现代 Web 开发中&#xff0c;随机数的生成看似简单&#xff0c;却隐藏着许多玄机。无论是生成密码、加密密钥&#xff0c;还是创建安全令牌&#xff0c;随机数的质量直接关系到系统的安全性。Jav…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文&#xff1f; 多租户隔离&#xff1a;自动为接入设备追加租户前缀&#xff0c;后端按 ClientID 拆分队列。零代码鉴权&#xff1a;将入站用户名替换为 OAuth Access-Token&#xff0c;后端 Broker 统一校验。灰度发布&#xff1a;根据 IP/地理位写…...

Nginx server_name 配置说明

Nginx 是一个高性能的反向代理和负载均衡服务器&#xff0c;其核心配置之一是 server 块中的 server_name 指令。server_name 决定了 Nginx 如何根据客户端请求的 Host 头匹配对应的虚拟主机&#xff08;Virtual Host&#xff09;。 1. 简介 Nginx 使用 server_name 指令来确定…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...