【C++STL基础入门】string迭代器

news2025/2/27 11:24:24

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、迭代器是什么?
  • 二、string迭代器
    • 1.定义迭代器
      • 理解
    • 2.通过迭代器遍历
      • 遍历方式1
      • 遍历方式2
    • 3.迭代器失效
    • 4.涉及到的迭代函数
      • 1、begin()
      • 2、end()
      • 3、append
      • erase函数
      • insert函数
  • 总结


前言

本系列STL使用VS2022+C++20版本

在C++中,标准模板库(Standard Template Library,STL)是一组强大的通用模板类和函数,它为我们提供了很多供使用的数据结构和算法。其中,string类是STL中一个非常有用的类,用于处理字符串。在使用string类时,我们经常需要遍历字符串的每个字符或者进行某些特定的操作。而实现遍历和操作的关键就是使用string迭代器。本文将详细介绍string迭代器的使用方法及其在处理字符串时的重要作用。


一、迭代器是什么?

当我们需要遍历一个集合(比如数组、列表或字符串)中的元素时,就像一个一个看每个元素,这时候迭代器就派上用场了。迭代器就像是一个指针,它可以帮助我们在集合中逐个地获取其中的元素,并且可以根据需要进行修改。你可以把迭代器想象成一个遥控器,可以让我们在集合中前进、后退,或者指向特定的元素。使用迭代器,我们不需要关心集合内部的具体实现细节,只需要专注于每个元素的访问和操作。

迭代器提供了一种抽象的方法来处理集合中的元素,它可以让我们在遍历过程中轻松访问每个元素,而不必担心底层数据结构是什么样的。迭代器分为不同的类型,每种类型有着特定的目的和功能。例如,我们可以使用迭代器来读取集合元素的值,也可以使用迭代器来修改元素的值,甚至可以删除或添加元素。

总的来说,迭代器是一种工具,帮助我们在集合中按照一定的顺序遍历和操作每个元素,使得我们能够更方便地处理集合中的数据。使用迭代器,我们可以以一种统一的方式处理不同类型的集合,提高了代码的可复用性和灵活性。

二、string迭代器

1.定义迭代器

使用string类中的静态类成员iterator

string::iterator ite;

在这里插入图片描述

理解

当我们说到迭代器时,可以将其想象为一个类似于指针的对象,它允许我们在容器(例如字符串)中按顺序访问元素或字符。

对于字符串(std::string),我们可以使用迭代器来遍历其中的字符。迭代器可以帮助我们逐个访问字符串中的每个字符,从头到尾,或者反向从尾到头。

想象一下,你有一串字母,比如 “Hello”,可以将迭代器看作是一根指向字符的手指。开始时,指向字符串的开头,即 ‘H’。然后,你可以通过移动指针(迭代器)来访问下一个字符,指向 ‘e’,再移动指针指向 ‘l’,以此类推,直到访问到最后一个字符 ‘o’。

2.通过迭代器遍历

使用迭代器,你可以根据需要遍历字符串的每个字符,无需手动跟踪当前位置或使用索引。迭代器本质上是一个帮助我们在容器中移动并访问元素的工具。

遍历方式1

for (ite = str.begin();ite != str.end(); ite++)
{
	cout << *ite;
}

在这里插入图片描述

使用+,-运算符可以移动迭代器的位置

遍历方式2

for (size_t i = 0;i < str.size(); i++)
{
	cout << ite[i];
}

在这里插入图片描述
可以使用下标运算符进行偏移

3.迭代器失效

当我们在遍历或修改容器(例如字符串)时,迭代器可以帮助我们定位我们当前所处理的位置。然而,有些操作可能会导致迭代器失效。迭代器失效意味着先前获取的迭代器不能再安全地用于访问或修改容器中的元素。

想象一下你在一列房子前移动,每个房子都有一个门牌号(表示元素的位置)。假设你手里拿着一块纸,并且上面写着当前所处的门牌号。你可以根据纸上的门牌号找到并访问对应的房子。

然而,当进行某些操作时,例如在容器中插入或删除元素,这可能会导致房子的位置发生变化,门牌号也可能会改变。这就好像有人在你背后改变了房子的排列或增加了新的房子,导致你手里的门牌号与实际的房子位置不匹配。

在这种情况下,你手里的门牌号(即迭代器)已经失效了,不能准确地指向原来的房子。如果你继续使用失效的门牌号(迭代器),可能会导致错误的访问或修改,因为它们不再匹配实际的元素位置。

迭代器失效的情况包括:

在容器中插入或删除元素时,迭代器可能会失效。
调整容器的大小,例如重新分配内存时,迭代器可能会失效。
对容器进行排序或其他操作,可能会导致迭代器失效。
为了避免使用失效的迭代器,我们需要小心处理潜在的迭代器失效情况。一般的做法是,在进行可能导致迭代器失效的操作之后,重新获取新的迭代器来确保其有效性。

通过了解迭代器失效的原因,并谨慎处理可能导致失效的操作,我们可以更好地控制迭代器的使用,避免出现错误的访问或修改。

4.涉及到的迭代函数

1、begin()

作用:取得容器的迭代器指向容器的第一个元素。
参数:无。
返回值:迭代器,指向容器的第一个元素。

2、end()

作用:取得容器的迭代器指向容器末尾的下一个位置。
参数:无。
返回值:迭代器,指向容器末尾的下一个位置。

begin()和end()示例代码:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello";

    // Using begin() and end() to iterate over the string
    for (auto it = str.begin(); it != str.end(); ++it) {
        std::cout << *it << " ";
    }
    std::cout << std::endl;

    return 0;
}

在这里插入图片描述

3、append

3、append( input_iterator start, input_iterator end );
作用:将指定范围内的元素添加到容器的末尾。
参数:
start:输入迭代器,指向添加元素范围的起始位置。
end:输入迭代器,指向添加元素范围的结束位置。
示例代码:

#include <iostream>
#include <string>
#include <iterator>

int main() {
    std::string str = "Hello";
    std::string input = " World";

    // 将输入字符串 " World" 的字符追加到原始字符串 "Hello"
    str.append(input.begin(), input.end());

    std::cout << str << std::endl;  // 输出结果:Hello World

    return 0;
}

在这里插入图片描述

erase函数

4、iterator erase( iterator pos );
作用:删除容器中指定位置的元素。
参数:
pos:迭代器,指向要删除的元素位置。
返回值:迭代器,指向删除元素后的位置。

示例代码:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";

    // 删除字符串中索引为6的字符(从0开始计数)
    auto erasePos = str.begin() + 6;
    str.erase(erasePos);

    std::cout << str << std::endl;  // 输出结果:Hello World!

    return 0;
}

在这里插入图片描述

5、iterator erase( iterator start, iterator end );
作用:删除容器中指定位置的元素。
参数:
pos:迭代器,指向要删除的元素位置。
返回值:迭代器,指向删除元素后的位置。

示例代码:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello, World!";

    // 删除字符串中从索引为6到索引为12的字符(左闭右开区间)
    auto eraseStart = str.begin() + 6;
    auto eraseEnd = str.begin() + 13;
    str.erase(eraseStart, eraseEnd);

    std::cout << str << std::endl;  // 输出结果:Hello!

    return 0;
}

在这里插入图片描述

insert函数

6、void insert( iterator i, size_type num, const char &ch );
作用:在指定位置前插入多个相同元素。
参数:
i:迭代器,指向插入位置。
num:要插入的元素数量。
ch:要插入的元素值。
返回值:无。

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello World";

    // 在字符串的第6个位置插入3个连续的字符 '!'
    auto insertPos = str.begin() + 6;
    size_t numChars = 3;
    char ch = '!';

    str.insert(insertPos, numChars, ch);

    std::cout << str << std::endl;  // 输出结果:Hello!!! World

    return 0;
}

在这里插入图片描述

7、void insert( iterator i, iterator start, iterator end );
作用:在指定位置插入另一个容器中给定范围的元素。
参数:
i:迭代器,指向插入位置。
start:另一个容器的迭代器,指向插入范围的起始位置。
end:另一个容器的迭代器,指向插入范围的结束位置。
返回值:无。

示例代码:

#include <iostream>
#include <string>

int main() {
    std::string str = "Hello World";

    // 在字符串的第6个位置插入 "!!!"
    auto insertPos = str.begin() + 6;
    std::string insertStr = "!!!";
    auto start = insertStr.begin();
    auto end = insertStr.end();

    str.insert(insertPos, start, end);

    std::cout << str << std::endl;  // 输出结果:Hello!!! World

    return 0;
}

在这里插入图片描述


总结

通过本文的介绍,我们了解了string迭代器的概念和使用方法。string迭代器提供了一种便捷的方式来遍历和操作字符串中的每个字符。我们可以选择合适的迭代器类型(iterator)来满足具体的需求。使用迭代器,我们可以高效地处理字符串中的字符,进行各种操作,如修改、查找、排序等。迭代器是C++ STL中非常强大且有用的特性之一,它使得我们可以更加灵活地操作数据结构。在实际编程中,我们可以充分利用string迭代器提供的功能来简化字符串的处理和操作

希望本文能够对您理解string迭代器的基础知识有所帮助。迭代器是C++ STL中的重要概念,掌握了迭代器的使用方法,可以让我们更好地利用STL提供的各种容器和算法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/915567.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

element 图标变颜色和更改大小

需求效果&#xff1a; element自带颜色不符合&#xff0c;且大小不一致。 // 穿透更改图标大小 /deep/ i.el-icon-info{font-size: 20px;} 颜色变化&#xff1a;

SpringCloud学习笔记(三)_服务提供者集群与服务发现Discovery

服务提供者集群 既然SpringCloud的是微服务结构&#xff0c;那么对于同一种服务&#xff0c;当然不可能只有一个节点&#xff0c;需要部署多个节点 架构图如下&#xff1a; 由上可以看出存在多个同一种服务提供者&#xff08;Service Provider&#xff09; 搭建服务提供者集…

基于Python的图书馆大数据可视化分析系统设计与实现

博主介绍&#xff1a;✌csdn特邀作者、博客专家、java领域优质创作者、博客之星&#xff0c;擅长Java、微信小程序、Python、Android等技术&#xff0c;专注于Java、Python等技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; …

u盘数据丢失但占内存如何恢复?不要着急,这里有拯救方案

U盘数据丢失但占内存如何恢复&#xff1f;数据丢失是一种让人非常头疼的问题&#xff0c;尤其是当我们的U盘数据丢失了&#xff0c;但内存仍然被占用时&#xff0c;更令人困惑和焦虑。然而&#xff0c;不要慌张&#xff01;在本文中&#xff0c;将为大家介绍一些有效的方法来恢…

STM32F4X 定时器PWM

STM32F4X 定时器PWM 什么是PWMSTM32F4X PWM使用GPIO引脚复用STM32F4X PWM配置参数定时器PWM输出通道定时器PWM输出模式定时器PWM有效电平定时器PWM工作过程定时器PWM频率计算 STM32F4X PWM配置步骤STM32F4X PWM配置函数 上节说到了定时器的定时功能&#xff0c;这节说一下定时器…

10种最流行的3D模型文件格式及转换方法

3D 文件格式用于存储有关 3D 模型的信息。 你可能听说过一些最流行的格式&#xff0c;包括 STL、OBJ、FBX 和 DAE。 它们广泛应用于从视频游戏动画到工业增材制造的各种应用中。 在本文中&#xff0c;我们将考虑为什么有这么多不同的格式&#xff0c;探讨 3D 文件格式存储的四…

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘c

已解决W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library ‘cudart64_110.dll’; dlerror: cudart64_110.dll not found I tensorflow/stream_executor/cuda/cudart_stub.cc:29] Ignore above cudart dlerror if you do not ha…

C++ 二叉搜索树的概念特性

1. 二叉搜索树 1.1 二叉搜索树概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树 &#xff0c;或者是具有以下性质的二叉树 : 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值 若它的右子树不为空&#xff0c;则右子树上所有节点的值都大…

华为云部署JDK环境

一、确定系统内核 在下载jdk之前要先确定自己的内核是什么版本&#xff0c;因为我选的云服务器是CentOS7&#xff0c;所以一定是Linux_86_64版本。 若不确定可以在命令行中输入“uname -a”来查看系统内核。 二、下载JDK 到官网下载对应统信系统版本的jdk安装包 jdk官网&…

Java进阶(5)——创建多线程的方法extends Thread和implements Runnable的对比 线程池及常用的线程池

目录 引出创建多线程的方法Thread类创建多线程Runnable接口创建多线程Thread类的常用方法两者的对比 线程池是啥&#xff1f;为啥用&#xff1f;结合案例理解常用的线程池继承Runnable接口的工人实体类newSingleThreadExecutor&#xff08;单线程&#xff09;newFixedThreadPoo…

Simulink仿真模块 - Clock

Clock&#xff1a;显示并提供仿真时间 库&#xff1a; Simulink / Sources 模型为&#xff1a; 说明 Clock 模块在每个仿真时间步输出当前仿真时间。此模块对需要仿真时间的其他模块非常有用。 当在离散系统中需要当前时间时&#xff0c;请使用Digital Clock模块。 实例 模块…

利用python批量掩膜提取遥感图像

&#xff08;1&#xff09; 前言 遥感影像的提取和分析在地理信息系统、环境监测、农业、城市规划等领域具有重要的应用价值。按掩膜提取遥感影像是一种常用的方法&#xff0c;它可以通过定义掩膜来选择感兴趣的区域&#xff0c;并排除其他干扰因素。 按掩膜提取遥感影像的方…

ssm网上服装销售系统源码和论文

ssm网上服装销售系统047 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 目前互联网上的网上销售系统每天以惊人的速度增加&#xff0c;网上购物越来越成为现代年轻人的首选&#xff0c;足不出门便能选购好自己…

H5商城公众号商城系统源码 积分兑换商城系统独立后台

网购商城系统源码 积分兑换商城系统源码 独立后台附教程 测试环境&#xff1a;NginxPHP7.0MySQL5.6thinkphp伪静态

胖小酱之广告

广告是一种宣传手段&#xff0c;通过一定形式的媒体&#xff0c;向公众传递信息的方式。广告可以分为广义和狭义两种&#xff0c;其中广义广告是指不以营利为目的的广告&#xff0c;如政府公告、社会团体声明等&#xff1b;狭义广告则是指以营利为目的的广告&#xff0c;通常是…

【JAVA基础】 IO详解

【JAVA基础】 IO详解 文章目录 【JAVA基础】 IO详解一、概述二、IO流的作用三、IO流的使用场景四、IO流的分类4.1 传输数据的单位分&#xff1a;4.2 数据传输的方向分&#xff1a;4.3 流的角色的不同分&#xff1a; 五、IO流体系六、字节输入流InputStream七、字节输出流 Outpu…

Python 从入门到实践第3版(中文版)正式版+编制版+电子版

Python编程&#xff1a;从入门到实践&#xff08;第3版&#xff09; ([美] 埃里克 • 马瑟斯&#xff08;Eric Matthes&#xff09;) 2023 (Z-Library)

【算法日志】动态规划刷题:01背包问题(day36)

代码随想录刷题60Day 前言 今天主要讨论背包问题中的01背包问题&#xff0c;这类问题的难点在于怎样对问题进行数学建模。一旦思考好问题的解决方式&#xff0c;剩下的步骤就比较简单了。 分割等和子集 本题可采用暴力回溯&#xff0c;但复杂度比较高&#xff0c;所以采取动态…

解决Win10运行软件程序提示【管理员已阻止你运行此应用】

一、问题描述 在Win10系统打开软件&#xff0c;弹窗提示【管理员已阻止你运行此应用】&#xff0c;如下图所示&#xff1a; 二、问题分析 是由于Windows系统的安全策略设置影响&#xff0c;保护你的电脑不被恶意程序破坏&#xff1b;只用修改系统的安全策略即可。 三、解决办法…

多目标优化算法知识点梳理

EA进化算法 MOEA多目标进化算法 1.MOEA的分类 1.1 按不同的进化机制分类 基于分解的MOEA&#xff1a;是比较早起所使用的方法&#xff1a;聚集函数法。将被优化的所有子目标组合或聚集为单个目标&#xff0c;从而将多目标优化问题转换为单目标优化问题。 基于支配关系的MOE…