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

C++ -string -常见用法2

博客主页:【夜泉_ly】
本文专栏:【C++】
欢迎点赞👍收藏⭐关注❤️

在这里插入图片描述

文章目录

  • 💡前言
  • 💡访问及遍历
    • 1.速览
    • 2.operator[] -重点⭐
      • 2.1函数原型
      • 2.2用法
      • 2.3与at
    • 3.迭代器
      • 3.1函数原型
      • 3.2用法速览
      • 3.3简介
    • 4.范围for
      • 4.1用法速览
      • 4.2简介
    • 5.访问首尾元素
      • 5.1函数原型
      • 5.2用法速览

💡前言

在这篇文章中,我将继续简单探讨 C++string 的基本用法。写这篇文章的主要目的是帮助我巩固所学的知识,同时也便于未来的复习和参考。

如果你想大致的了解string的基本用法,也可以留下来看看。

对于那些希望深入学习更多细节的读者,可以去看看这个网站:cplusplus.com,以获取更全面的参考资料。

💡访问及遍历

1.速览

int main()
{string str("Hello World");//最简单的遍历方式就是operator<<cout << str << endl;//用下标遍历:for(size_t i = 0; i < str.size(); i++){cout << str[i];}cout << endl;//用迭代器遍历:string::iterator i = str.begin();while(i != str.end()){cout << *i++;}cout << endl;//用范围for遍历:for(auto e : str){cout << e;}cout << endl;//访问首尾元素:cout << str.front() << " " << str.back() << endl;return 0;
}

Output:

Hello World
Hello World
Hello World
Hello World
H d

2.operator[] -重点⭐

2.1函数原型

char& operator[] (size_t pos);
const char& operator[] (size_t pos) const;

2.2用法

和数组的用法是一样的。

2.3与at

at也是string类中提供的函数,其函数原型:

char& at (size_t pos);
const char& at (size_t pos) const;

如果正常使用,[]at是一致的,一般不用at,用[]
如果乱传pos[]at有些许不同:

  • pos不符合[]at的规范,[]会断言报错,at会抛异常:

    string str("Hello World");
    str[666];
    

    在这里插入图片描述

    try
    {str.at(666);
    }
    catch (const std::exception& e)
    {cout << e.what() << endl;
    }
    

    在这里插入图片描述

  • 对于[]

    • pos0 ~ size-1没有问题。
    • 如果是常对象,possize没有问题。
    • 其他情况,都是未定义行为。
      在这里插入图片描述
  • 对于at

    • pos只能传0 ~ size-1
    • 其他情况,会抛出异常。
      在这里插入图片描述

3.迭代器

3.1函数原型

begin:

iterator begin();
const_iterator begin() const;

end:

iterator end();
const_iterator end() const;

rbegin:

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

rend:

reverse_iterator rend();
const_reverse_iterator rend() const;

cbegin、cend、crbegin、crend:

const_iterator cbegin() const noexcept;
const_iterator cend() const noexcept;
const_reverse_iterator crbegin() const noexcept;
const_reverse_iterator crend() const noexcept;

3.2用法速览

begin、end、rbegin、rend:

int main()
{string str(6, 0);//正向遍历并修改:string::iterator it = str.begin();for (char i = '0'; it != str.end(); i++, it++){*it = i;}cout << "str: " << str << endl;//反向遍历并打印:string::reverse_iterator rit = str.rbegin();while (rit != str.rend()){cout << *rit;rit++;} cout << endl;return 0;
}

Output:

str: 012345
543210

与begin、end、rbegin、rend不同,
cbegin、cend、crbegin、crend只能针对const修饰的string类对象,一般不用这几个。

3.3简介

迭代器是像指针一样的类型,有可能是指针,有可能不是指针。
一般用于对应STL中各种函数的接口,其作用也类似于指针。
string中,一般不会手动控制迭代器,推荐使用[]

正向迭代:
begin指向首元素,end指向末尾元素后一个位置,加加迭代器使其正向移动一步。
反向迭代:
rbegin指向末尾元素,rend指向首元素前一个位置,加加迭代器使其反向移动一步。
注意
这里都是开区间:[begin,end)、 [rbegin,rend)

例如:

void Test()
{string str("B 6 6 6 E");string::iterator it_B = str.begin();string::iterator it_E = str.end();string::reverse_iterator rit_B = str.rbegin();string::reverse_iterator rit_E = str.rend();cout << "*(it_B):" << *it_B << "	*(it_E - 1):" << *(it_E - 1) << endl;cout << "*(rit_B):" << *rit_B << "	*(rit_E - 1):" << *(rit_E - 1) << endl;
}

Output:

*(it_B):B       *(it_E - 1):E
*(rit_B):E      *(rit_E - 1):B

另外,迭代器中加了assert断言,因此只要位置不合理都会直接报错,比如尝试让上面代码中的it_B--;
在这里插入图片描述
或者让it_E++:
在这里插入图片描述

4.范围for

只要支持迭代器,就支持范围for!!!

4.1用法速览

void Test()
{string str("Hello World");for (char c : str)cout << c;cout << endl;for (char c : str.rbegin())cout << c;
}

Output:

Hello World

4.2简介

范围for是C++给出的一颗语法糖,使用极其便利。
在上面我标了一句话:只要支持迭代器,就支持范围for!!!
因为范围for是基于迭代器实现的。

void Test()
{string str("Hello World");for (auto it = str.begin(); it != str.end(); it++)cout << *it;for (char c : str)cout << c;
}

在这里插入图片描述
在这里插入图片描述

5.访问首尾元素

5.1函数原型

      char& back();
const char& back() const;char& front();
const char& front() const;

5.2用法速览

只能提供首尾元素,用的不多。

void Test()
{string str("6 6 6 6 6");str.front() = 'F';str.back() = 'B';cout << "Front:" << str.front() << endl;cout << "Back:" << str.back() << endl;
}

Output:

Front:F
Back:B

需注意,如果为空串,会导致未定义行为。

在这里插入图片描述


希望本篇文章对你有所帮助!并激发你进一步探索编程的兴趣!
本人仅是个C语言初学者,如果你有任何疑问或建议,欢迎随时留言讨论!让我们一起学习,共同进步!

相关文章:

C++ -string -常见用法2

博客主页&#xff1a;【夜泉_ly】 本文专栏&#xff1a;【C】 欢迎点赞&#x1f44d;收藏⭐关注❤️ 文章目录 &#x1f4a1;前言&#x1f4a1;访问及遍历1.速览2.operator[] -重点⭐2.1函数原型2.2用法2.3与at 3.迭代器3.1函数原型3.2用法速览3.3简介 4.范围for4.1用法速览4.2…...

为您的 WordPress 网站打造完美广告布局 A5广告单元格插件

一个为 WordPress 网站量身定制的强大工具,它将彻底改变您展示广告的方式 灵活多变的布局设计 A5 广告单元格插件的核心优势在于其无与伦比的灵活性。无论您是想要创建整齐的网格布局,还是希望打造独特的不规则设计,这款插件都能满足您的需求。 自定义网格数量&#xff1a;从 2…...

前端的AI工具:ChatGPT Canvas与Claude Artifacts对比 -仅仅是OpenAI一个迟来的追赶吗?- 贺星舰五飞试验成功

如果你对OpenAI的ChatGPT Canvas和Anthropic的Claude Artifacts有所耳闻&#xff0c;可能会想知道这两个工具有何不同&#xff0c;以及哪个能让你的工作流程更加顺畅。这两个工具旨在提升生产力&#xff0c;但侧重点各异——编码、写作、创意和实时反馈。 本文将深入探讨ChatG…...

GNU链接器(LD):输出分区类型(NOLOAD、READONLY、DSECT、COPY、INFO、OVERLAY)介绍

0 参考资料 GNU-LD-v2.30-中文手册.pdf GNU linker.pdf1 前言 一个完整的编译工具链应该包含以下4个部分&#xff1a; &#xff08;1&#xff09;编译器 &#xff08;2&#xff09;汇编器 &#xff08;3&#xff09;链接器 &#xff08;4&#xff09;lib库 在GNU工具链中&…...

【MySQL】表的查询操作——SELECT

目录 1.select的基本使用 1.1.查询所有列 1.2.查询特定列 1.3.DISTINCT关键字的使用——查询不重复的年级 1.4.带条件的查询 1.5.排序查询结果 1.6.LIMIT的使用——限制返回的行数 1.7.组合使用 WHERE、ORDER BY 和 LIMIT 1.8.查询字段为表达式 1.9.为查询结果指定别名…...

天地伟业NVR管理工具EasyNVR平台多个NVR同时管理运行后日志一直在打印error

视频安防监控平台天地伟业NVR管理工具EasyNVR可支持设备通过RTSP/Onvif协议接入&#xff0c;并能对接入的视频流进行处理与多端分发&#xff0c;包括RTMP、RTSP、WS-FLV、HTTP-FLV、WebRTC、HLS等多种视频流格式。平台可提供视频实时监控直播、云端录像、录像检索、云存储与回看…...

HAL+M4学习记录_7

一、TIM 记录学习HAL配置TIM定时器 1.1 简介 TIM&#xff08;timer&#xff09;定时器&#xff0c;16位或32位&#xff08;TIM2和TIM5&#xff09;计数器、预分频器&#xff08;16位&#xff09;、自动重装寄存器的时基单元&#xff1b;可对输入时钟进行计数&#xff0c;在计数…...

mysql 慢查询日志slowlog

慢查询参数 slow log 输出示例 # Time: 2024-08-08T22:39:12.80425308:00 #查询结束时间戳 # UserHost: root[root] localhost [] Id: 83 # Query_time: 2.331306 Lock_time: 0.000003 Rows_sent: 9762500 Rows_examined: 6250 SET timestamp1723127950; select *…...

基于AES的遥感图像加密算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 4.1 AES 加密算法概述 4.2 基于 AES 的遥感图像加密算法原理 5.完整程序 1.程序功能描述 通过AES算法对遥感图像进行加密和解密&#xff0c;分析加解密处理后图像的直方图&#xff0c;相关…...

MySQL insert 记录后查询是乱码问题分析

问题现象 后台应用程序使用的是云上的 MySQL 服务&#xff0c;需要给 MySQL 数据表里 insert 一些数据&#xff0c;平时都是先运行一个 MySQL 的 pod&#xff1a; kubectl run mysql-client --rm -it --restartNever --image mysql:5.7 --command -- env LANGC.UTF-8 mysql -…...

字符串算法之AC 自动机(Aho-Corasick Algorithm, 多模式匹配)详细解读

AC自动机&#xff08;Aho-Corasick Algorithm&#xff09;是一种高效的多模式字符串匹配算法&#xff0c;用于同时查找多个模式串&#xff08;子串&#xff09;在文本串中的出现位置。它结合了字典树&#xff08;Trie&#xff09;和有限状态机&#xff08;Finite State Machine…...

YoloV10改进:Block改进|使用ContextAggregation模块改善C2f模块|即插即用

摘要 在计算机视觉领域&#xff0c;目标检测与实例分割任务一直是研究的热点。YoloV10作为目标检测领域的佼佼者&#xff0c;凭借其出色的性能和效率赢得了广泛的认可。然而&#xff0c;随着技术的不断进步&#xff0c;如何进一步提升YoloV10的性能成为了我们追求的目标。近期…...

学习之高阶编程str方法

__str__方法 问题思考:交互环境下print打印的内容和和直接输入变量&#xff0c;返回的内容不一样这是为什么?. 使用print打印的时候触发的是_str_方法&#xff0c; 注意点: 重写str&#xff0c;必须要记得写return. return返回的必须是一个字符串对象。 class MyClass:def _…...

FreeRTOS:事件标志组

目录 一、简介 二、 事件控制块 三、相关API 四、 应用场景 一、简介 在FreeRTOS中&#xff0c;使用信号量可以实现同步&#xff0c;但是使用信号量来同步的话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行同步&#xff0c;此时信号量就无能为力。…...

【高分论文密码】AI赋能大尺度空间模拟与不确定性分析及数字制图

随着AI大语言模型的广泛应用&#xff0c;大尺度空间模拟预测与数字制图技术在不确定性分析中的重要性日益凸显。这些技术已经成为撰写高分SCI论文的关键工具&#xff0c;被誉为“高分论文密码”。大尺度模拟技术能够从不同的时空尺度揭示农业生态环境领域的内在机理和时空变化规…...

智能摆件(墨水屏)

因为需要申请8k的堆&#xff0c;所以需要更改堆的大小 stm32修改堆栈大小&#xff08;堆栈空间不足导致死机&#xff09;_minimum heap size-CSDN博客...

ansible————playbook

一、playbook和ad hoc命令 ad hoc命令是单行&#xff0c;一个简单的任务&#xff0c;运行一次。ansible真正强大的地方是使用ansible的playbook重复运行多次复杂的任务。 一个play是是一组有序的任务&#xff0c;该paly对应着在inventory被选择的主机。一个playbook是一个包含…...

linux日志分割工具logorate快速验证配置是否有效

创建一些文件, 并修改文件的mtime(修改时间) # /var/log/test/*.log touch -d "2024-10-14" test1.log touch -d "2024-10-15" test2.log touch -d "2024-10-16" test3.log touch -d "2024-10-17" test4.log#快速创建一个1G的大文…...

Unity3D URP画面品质的上限如何详解

Unity3D是一款广泛应用于游戏开发的引擎&#xff0c;它提供了多种渲染管线用于实现不同的画面品质。其中一种渲染管线是Universal Render Pipeline&#xff08;简称URP&#xff09;&#xff0c;它是Unity3D的一种轻量级渲染管线&#xff0c;专注于提供高性能和可移植性。 对惹…...

风管阻力计算

风管阻力主要包括摩擦阻力和局部阻力两大类。摩擦阻力:空气在风管内流动时,与管壁的摩擦作用导致的能量损失,与管道长度、断面尺寸、风速、空气密度等参数有关。局部阻力:风管系统中的弯头、三通、变径、阀门等部件,由于改变了气流的流动方向或速度,导致的额外能量损失,用局部阻…...

React Native 开发环境搭建(全平台详解)

React Native 开发环境搭建&#xff08;全平台详解&#xff09; 在开始使用 React Native 开发移动应用之前&#xff0c;正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南&#xff0c;涵盖 macOS 和 Windows 平台的配置步骤&#xff0c;如何在 Android 和 iOS…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

大语言模型如何处理长文本?常用文本分割技术详解

为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

ip子接口配置及删除

配置永久生效的子接口&#xff0c;2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

技术栈RabbitMq的介绍和使用

目录 1. 什么是消息队列&#xff1f;2. 消息队列的优点3. RabbitMQ 消息队列概述4. RabbitMQ 安装5. Exchange 四种类型5.1 direct 精准匹配5.2 fanout 广播5.3 topic 正则匹配 6. RabbitMQ 队列模式6.1 简单队列模式6.2 工作队列模式6.3 发布/订阅模式6.4 路由模式6.5 主题模式…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案&#xff1a;Java 字节码技术实战分享&#xff08;仅供学习&#xff09; 一、Aspose.PDF 简介二、说明&#xff08;⚠️仅供学习与研究使用&#xff09;三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

现有的 Redis 分布式锁库(如 Redisson)提供了哪些便利?

现有的 Redis 分布式锁库&#xff08;如 Redisson&#xff09;相比于开发者自己基于 Redis 命令&#xff08;如 SETNX, EXPIRE, DEL&#xff09;手动实现分布式锁&#xff0c;提供了巨大的便利性和健壮性。主要体现在以下几个方面&#xff1a; 原子性保证 (Atomicity)&#xff…...

Caliper 配置文件解析:fisco-bcos.json

config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...