【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…...

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

React19源码系列之 事件插件系统
事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...