【C++】初谈迭代器
文章目录
- 前言
- 一、什么是迭代器
- 二、迭代器的分类
- 三、迭代器的用法
- 总结
前言
迭代器是一种可以访问和遍历容器中元素的对象,它类似于指针,但是具有更多的功能和灵活性。本文将介绍C++迭代器的基本概念、分类、用法和注意事项。
一、什么是迭代器
迭代器(iterator)是一种抽象的数据类型,它可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。迭代器相当于容器和操作容器的算法之间的桥梁,使得算法可以适用于不同类型的容器。
迭代器的用法类似于指针,可以使用 * 运算符来解引用迭代器,获取它指向的元素的值或引用。也可以使用 ++ 和 – 运算符来移动迭代器的位置,使其指向容器中的前一个或后一个元素。另外,还可以使用 == 和 != 运算符来比较两个迭代器是否相等或不等,即是否指向同一个元素。
二、迭代器的分类
C++标准库中定义了五种类型的迭代器,它们分别是:
- 输入迭代器(Input Iterator):只能从容器中读取元素,不能修改元素。只能单向移动,即只能使用 ++ 运算符。
- 输出迭代器(Output Iterator):只能向容器中写入元素,不能读取元素。只能单向移动,即只能使用 ++ 运算符。
- 前向迭代器(Forward Iterator):可以读写容器中的元素。可以多次遍历同一容器,即可以重复使用 ++ 运算符。
- 双向迭代器(Bidirectional Iterator):可以读写容器中的元素。可以双向移动,即可以使用 ++ 和 – 运算符。
- 随机访问迭代器(Random Access Iterator):可以读写容器中的元素。可以随机访问任意位置的元素,即可以使用 +、-、+=、-=、[] 等运算符。
不同类型的迭代器具有不同的功能和限制,它们之间存在包含关系。例如随机访问迭代器是最强大的一种迭代器,它包含了其他所有类型迭代器的功能。反之,输出迭代器是最弱的一种迭代器,它只能执行最基本的操作。
不同类型的容器提供了不同类型的迭代器,如下表所示:
| 容器 | 迭代器类型 |
|---|---|
| vector | 随机访问 |
| deque | 随机访问 |
| list | 双向 |
| forward_list | 前向 |
| set/multiset | 双向 |
| map/multimap | 双向 |
| unordered_set/unordered_multiset | 前向 |
| unordered_map/unordered_multimap | 前向 |
| stack | 不支持 |
| queue | 不支持 |
| priority_queue | 不支持 |
从表中可以看出,顺序容器(vector、deque、list、forward_list)提供了随机访问、双向或前向三种类型的迭代器;关联容器(set/multiset、map/multimap)提供了双向类型的迭代器;无序关联容器(unordered_set/unordered_multiset、unordered_map/unordered_multimap)提供了前向类型的迭代器;容器适配器(stack、queue、priority_queue)不支持迭代器。
三、迭代器的用法
要使用一个容器的迭代器,首先需要定义一个迭代器变量,其一般形式为:
容器类型::iterator 迭代器名;
例如,要定义一个 vector 容器的迭代器,可以写为:
vector<int>::iterator it;
也可以使用 auto 关键字来自动推断迭代器的类型,如:
auto it = v.begin(); // v 是一个 vector 容器
要获取一个容器的迭代器,可以使用容器的成员函数 begin() 和 end(),它们分别返回指向容器第一个元素和最后一个元素之后位置的迭代器。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = v.begin(); // it1 指向 v 的第一个元素,即 1
auto it2 = v.end(); // it2 指向 v 的最后一个元素之后的位置,即 5 的后面
也可以使用全局函数 std::begin() 和 std::end() 来获取容器的迭代器,它们的功能和成员函数相同。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = std::begin(v); // it1 指向 v 的第一个元素,即 1
auto it2 = std::end(v); // it2 指向 v 的最后一个元素之后的位置,即 5 的后面
要访问迭代器指向的元素,可以使用 * 运算符来解引用迭代器,获取它指向的元素的值或引用。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
cout << *it << endl; // 输出 1
*it = 10; // 修改 it 指向的元素的值为 10
cout << *it << endl; // 输出 10
要移动迭代器的位置,可以使用 ++ 和 – 运算符来使迭代器指向容器中的前一个或后一个元素。注意,只有双向或随机访问类型的迭代器才支持 – 运算符。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
++it; // it 指向 v 的第二个元素,即 2
--it; // it 指向 v 的第一个元素,即 1
it++; // it 指向 v 的第二个元素,即 2
it--; // it 指向 v 的第一个元素,即 1
要比较两个迭代器是否相等或不等,可以使用 == 和 != 运算符。如果两个迭代器指向同一个容器中的同一个元素,则它们相等;否则,它们不等。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it1 = v.begin(); // it1 指向 v 的第一个元素,即 1
auto it2 = v.begin(); // it2 指向 v 的第一个元素,即 1
cout << (it1 == it2) << endl; // 输出 true
++it2; // it2 指向 v 的第二个元素,即 2
cout << (it1 == it2) << endl; // 输出 false
对于随机访问类型的迭代器,还可以使用 +、-、+=、-=、[] 等运算符来随机访问任意位置的元素。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
it += 3; // it 指向 v 的第四个元素,即 4
了解了上面的迭代器基本操作后,就可以对容器进行遍历。例如:
vector<int> v = {1, 2, 3, 4, 5};
auto it = v.begin(); // it 指向 v 的第一个元素,即 1
while(it != v.end())
{cout<<*it<<" ";it++;
}
cout<<endl;
总结
本篇文章简要介绍了STL六大组件之一的迭代器(iterator)的基本用法,希望对大家有所帮助。
相关文章:
【C++】初谈迭代器
文章目录 前言一、什么是迭代器二、迭代器的分类三、迭代器的用法总结 前言 迭代器是一种可以访问和遍历容器中元素的对象,它类似于指针,但是具有更多的功能和灵活性。本文将介绍C迭代器的基本概念、分类、用法和注意事项。 一、什么是迭代器 迭代器&a…...
PL端案例开发手册
目 录 前 言 1 工程编译、程序加载方法 1.1 工程编译 1.2 程序加载 2 led-flash 2.1 案例说明 2.2 操作说明 2.3 关键代码 更多帮助 前 言 本文主要介绍PL端案例的使用说明,适用开发环境:Windows 7/10 64bit、Xilinx Unified 20…...
华为OD-整数对最小和
题目描述 给定两个整数数组array1、array2,数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素,现在需要取出k对元素,并对取出的所有元素求和,计算和的最小值 代码实现 # coding:utf-8 class Solution:…...
Ubuntu 22LTS 配置静态IP
可行方法,需界面配置 转载自:哔哩哔哩链接地址 命令行配置:待补充...
【Python】Python爬虫:网络数据的提取利器
随着互联网的快速发展,网络数据已经成为了一项重要的资源。如何从海量的网络数据中提取出我们需要的信息,就成为了各个行业都需要解决的问题。而Python爬虫,就是解决这个问题的利器。 首先,让我们了解一下什么是Python爬虫。Pyth…...
20.图的遍历
目录 一. 深度优先遍历 二. 广度优先遍历 图的遍历算法和二叉树不同的是,图中可能存在回路,且图的任一顶点都可能与其它顶点相通,在访问完某个顶点之后可能会沿着某些边又回到了曾经访问过的顶点。为了避免重复访问,我们的解决思…...
ARM DIY(一)电源、SD卡座、SOC 调试
文章目录 前言加热台焊接热风枪吹焊电烙铁补焊电源调试SD 卡座调试DRAM 电路调试串口电路调试SOC 调试成品 前言 之前打样的几块 ARM 板,一直放着没去焊接。今天再次看到,决定把它焊起来。 加热台焊接 为了提高焊接效率,先使用加热台焊接…...
数学建模知识之小白入门篇
数学建模知识--小白入门篇 一、数学模型的定义二、建立数学模型的方法和步骤1. 模型准备2. 模型假设3. 模型构成4. 模型求解5. 模型分析 三、数模竞赛出题的指导思想四、竞赛中的常见题型1. 实际问题背景2.若干假设条件3.要求回答的问题 五、提交一篇论文…...
【日常积累】Linux下ftp服务安装
概述 FTP是一种在互联网中进行文件传输的协议,基于客户端/服务器模式,默认使用20、21号端口,其中端口20用于进行数据传输,端口21用于接受客户端发出的相关FTP命令与参数。FTP服务器普遍部署于内网中,具有容易搭建、方…...
确定了,TikTok将于9月12日正式关闭美国半闭环
外媒报道称,TikTok已对其官网的常见问题页面进行了更新。消息显示,其在美国和英国市场运营的半封闭模式将于9月12日正式结束,并将全力推进TikTok闭环小店业务。尽管我们早在本月初就获悉了这一消息,但实际得知后仍不免有些感慨。曾…...
ATFX汇评:英国7月零售销售年率大降,GBPUSD仍未升破1.3000
ATFX汇评:7月季调后零售销售年率,最新值-3.2%,前值-1.6%,降幅扩大;7月季调后核心零售销售年率,最新值-3.4%,前值-1.6%,降幅扩大。零售销售综合衡量除服务业外包括所有主要从事零售业…...
CTFhub-sqli注入-Referer注入
在最后添加 Referer: (注意 R 大写, Referer后面是 :,Content-Length: 与 Referer: 之间没有空行) 1 2 3 1 union select 1,database() -1 union select 1,database() -1 union select 1,group_concat(table_name)from information_sche…...
【案例】登录注册
<template><div class"loginhome"><Header :butShow"butShow"></Header><div class"formdiv"><div style"text-align:center;padding:10px;"><h3>你好登录账号{{ stauts 3? 注册:登录 }}…...
Unity 物体的运动之跟随鼠标
你想让鼠标点击哪里,你的运动的对象就运动到哪里吗? Please follow me ! 首先,你要先添加一个Plane ,以及你的围墙,你的移动的物体 想要实现跟随鼠标移动,我们先创建一个脚本 using System.Collections; using Syst…...
C++基础Ⅱ变量
目录儿 4 变量4.1 原始数据类型字符 char整型 short整型 int整型 long整型 long long单精度浮点型 float双精度浮点型 double布尔型 bool 4.2 sizeof 关键字 5 指针和引用 4 变量 4.1 原始数据类型 原始数据类型是构建C程序的最基础数据类型 所有数据都是基于这些原始数据类型…...
Linux管理SpringBoot应用shell脚本实现
Liunx系统如何部署和管理SpringBoot项目应用呢?最简单的方法就是写个shell脚本。 Spring Boot是Java的一个流行框架,用于开发企业级应用程序。下面我们将学习如何在Linux服务器上部署Spring Boot应用,并通过一个脚本实现启动、停止、重启等操…...
一篇搞懂浏览器的工作原理(万字详解)
摘要 本文是学习极客时间上的课程,进而整理出的浏览器工作原理。 第一部分:浏览器的进程和线程 (1)进程和线程的区别? 在浏览器中,各个进程负责处理自己的事情,而不同的进程中,也…...
C语言调用python训练的机器学习模型(项目需求轻体量)
问题描述 机器学习模型基本上都是python下的实现与使用,有关C如何调用训练好的模型或是C实现模型的相关教程相对较少 同时,项目需求整个模型大小尽可能小,大概在几十Kb 由于是表格类型的数据,因此主要考虑树模型 一般而言&#…...
get和post请求的区别以及post请求的url参数问题
1.主要区别 1.GET请求方法有以下几个特点: 默认的请求方法;GET请求通常用于获取信息,所以应该是安全的、幂等的;请求数据表现在URL上,以名称/值的形式发送。对请求的长度有限制;在IE和Opera等浏览器会产生…...
android NullPointerException externalCacheDir
先看代码: fun Context.getMyCacheDir(): String {return externalCacheDir!!.absolutePath "/my_cache" }如上代码,在某些手机可能会出现crash。 原因详细阅读api,注意他有一个大大的注解Nullable: Nullablepublic a…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
【Linux手册】探秘系统世界:从用户交互到硬件底层的全链路工作之旅
目录 前言 操作系统与驱动程序 是什么,为什么 怎么做 system call 用户操作接口 总结 前言 日常生活中,我们在使用电子设备时,我们所输入执行的每一条指令最终大多都会作用到硬件上,比如下载一款软件最终会下载到硬盘上&am…...
【深尚想】TPS54618CQRTERQ1汽车级同步降压转换器电源芯片全面解析
1. 元器件定义与技术特点 TPS54618CQRTERQ1 是德州仪器(TI)推出的一款 汽车级同步降压转换器(DC-DC开关稳压器),属于高性能电源管理芯片。核心特性包括: 输入电压范围:2.95V–6V,输…...
智警杯备赛--excel模块
数据透视与图表制作 创建步骤 创建 1.在Excel的插入或者数据标签页下找到数据透视表的按钮 2.将数据放进“请选择单元格区域“中,点击确定 这是最终结果,但是由于环境启不了,这里用的是自己的excel,真实的环境中的excel根据实训…...
初级程序员入门指南
初级程序员入门指南 在数字化浪潮中,编程已然成为极具价值的技能。对于渴望踏入程序员行列的新手而言,明晰入门路径与必备知识是开启征程的关键。本文将为初级程序员提供全面的入门指引。 一、明确学习方向 (一)编程语言抉择 编…...
板凳-------Mysql cookbook学习 (十--2)
5.12 模式匹配中的大小写问题 mysql> use cookbook Database changed mysql> select a like A, a regexp A; ------------------------------ | a like A | a regexp A | ------------------------------ | 1 | 1 | --------------------------…...
[electron]预脚本不显示内联script
script-src self 是 Content Security Policy (CSP) 中的一个指令,它的作用是限制加载和执行 JavaScript 脚本的来源。 具体来说: self 表示 当前源。也就是说,只有来自当前网站或者当前页面所在域名的 JavaScript 脚本才被允许执行。"…...
