【C++ STL迭代器】iterator

文章目录

  • 【 1. 迭代器的属性 】
  • 【 2. 不同容器支持的迭代器 】
  • 【 3. 迭代器的定义方式 】
  • 【 4. 实例 】
    • 4.1 定义方式:正向迭代器和反向迭代器
    • 4.2 迭代器属性:前向迭代、双向迭代、随机迭代
    • 4.2 迭代器的遍历方法
    • 4.3 auto关键字 自动指定迭代器定义类型

  • 背景
    • 我们知道,尽管不同容器的内部结构各异,但它们本质上都是用来存储大量数据的,换句话说,都是一串能存储多个数据的存储单元。因此,诸如数据的排序、查找、求和等需要对数据进行遍历的操作方法应该是类似的。
    • 既然类似,完全可以利用泛型技术,将它们设计成适用所有容器的通用算法,从而将容器和算法分离开。但实现此目的需要有一个类似中介的装置,它除了要具有对容器进行遍历读写数据的能力之外,还要能对外隐藏容器的内部差异,从而以统一的界面向算法传送数据。
    • 这是泛型思维发展的必然结果,于是迭代器就产生了。简单来讲,迭代器和 C++ 的指针非常类似,它 可以是需要的任意类型,通过迭代器可以指向容器中的某个元素,如果需要,还可以对该元素进行读/写操作。

【 1. 迭代器的属性 】

  • 常用的迭代器按功能强弱分为输入迭代器、输出迭代器、前向迭代器、双向迭代器、随机访问迭代器 5 种。
  • 输入迭代器和输出迭代器
    比较特殊,它们不是把数组或容器当做操作对象,而是 把输入流/输出流作为操作对象
  • 前向迭代器(forward iterator)
    假设 p 是一个前向迭代器,则 p 支持 ++p,p++,*p 操作,还可以被复制或赋值,可以用 == 和 != 运算符进行比较 。此外,两个正向迭代器可以互相赋值
  • 双向迭代器(bidirectional iterator)
    双向迭代器 具有正向迭代器的全部功能,除此之外,假设 p 是一个双向迭代器,则 还可以进行 --p 或者 p-- 操作(即一次向后移动一个位置)
  • 随机访问迭代器(random access iterator)
    随机访问迭代器 具有双向迭代器的全部功能 。除此之外,假设 p 是一个随机访问迭代器,i 是一个整型变量或常量,则 p 还支持以下操作:
    • p+=i:使得 p 往后移动 i 个元素。
    • p-=i:使得 p 往前移动 i 个元素。
    • p+i:返回 p 后面第 i 个元素的迭代器。
    • p-i:返回 p 前面第 i 个元素的迭代器。
    • p[i]:返回 p 后面第 i 个元素的引用。
    • 此外,两个随机访问迭代器 p1、p2 还可以用 <、>、<=、>= 运算符进行比较。另外,表达式 p2-p1 也是有定义的,其返回值表示 p2 所指向元素和 p1 所指向元素的序号之差(也可以说是 p2 和 p1 之间的元素个数减一)。

【 2. 不同容器支持的迭代器 】

  • STL 标准库为每一种标准容器定义了一种迭代器类型,这意味着,不同容器对应的迭代器不同,其功能强弱也有所不同(容器的迭代器的功能强弱,决定了该容器是否支持 STL 中的某种算法)。不同容器对应的迭代器类型如下所示:
容器对应的迭代器类型
array随机访问迭代器
vector随机访问迭代器
deque随机访问迭代器
list双向迭代器
set / multiset双向迭代器
map / multimap双向迭代器
forward_list前向迭代器
unordered_map / unordered_multimap前向迭代器
unordered_set / unordered_multiset前向迭代器
stack不支持迭代器
queue不支持迭代器

容器适配器 stack 和 queue 没有迭代器,它们包含有一些成员函数,可以用来对元素进行访问。

【 3. 迭代器的定义方式 】

  • 尽管不同容器对应着不同类别的迭代器,但这些迭代器有着较为统一的定义方式:
迭代器定义方式具体格式
正向迭代器容器类名::iterator 迭代器名;
常量正向迭代器容器类名::const_iterator 迭代器名;
反向迭代器
(全称:反向迭代器适配器)
容器类名::reverse_iterator 迭代器名;
常量反向迭代器容器类名::const_reverse_iterator 迭代器名;
  • 定义以上几种迭代器后,就可以读取它指向的元素: *迭代器名 就表示迭代器指向的元素。
  • 常量迭代器和非常量迭代器的区别:
    通过非常量迭代器还能修改其指向的元素
  • 反向迭代器和正向迭代器的区别
    • 正向迭代器进行 ++操作 时,迭代器会 指向容器中的后一个元素
    • 反向迭代器进行 ++操作 时,迭代器会 指向容器中的前一个元素
  • 注意,以上 4 种定义迭代器的方式,并不是每个容器都适用。有一部分容器同时支持以上 4 种方式,比如 array、deque、vector;而有些容器只支持其中部分的定义方式,例如 forward_list 容器只支持定义正向迭代器,不支持定义反向迭代器。

【 4. 实例 】

4.1 定义方式:正向迭代器和反向迭代器

  • 以 vector容器 为例,实现正向迭代器和反向迭代器这两种定义方式。
#include <iostream>
#include <vector>
using namespace std;int main() 
{vector <int> vec = {1, 2,3, 4 ,5};//正向迭代器vector <int>::iterator t1;for (t1 = vec.begin(); t1 != vec.end(); ++t1)cout << *t1 << " ";cout << endl;//反向迭代器vector <int>::reverse_iterator  t2;t2 = vec.rbegin();for (; t2 != vec.rend(); ++t2)cout << *t2 << " ";return 0;
}

在这里插入图片描述

4.2 迭代器属性:前向迭代、双向迭代、随机迭代

  • 以 vector 容器为例,vector容器属于随机访问迭代器,也支持前向迭代和双向迭代。表现前向迭代、双向迭代、随机访问迭代三种属性。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector <int> vec = { 1,2,3,4,5 };vector <int>::iterator t;//正向迭代器的定义方式//前向迭代,前向迭代器可以实现p++for (t = vec.begin(); t != vec.end(); ++t)cout << *t << " ";cout << endl;//双向迭代,双向迭代器可以实现p--t = vec.end()-1;for (int j = 0; j < vec.size(); ++j){cout << *t << " ";if (t !=vec.begin())  t--;}cout << endl;//随机迭代,随机迭代器可以实现p+it = vec.begin();t = t+2;cout << *t << " ";return 0;
}

在这里插入图片描述

4.2 迭代器的遍历方法

  • 以 vector 容器为例,按照正向迭代器的定义方式,下面的程序中,每个循环演示了一种做法。
//遍历 vector 容器。
#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v{ 1,2,3,4,5,6,7,8,9,10 }; //v被初始化成有10个元素vector<int>::iterator i;//创建一个正向迭代器cout << endl << "第 1 种遍历方法:" << endl;for (i = v.begin(); i != v.end(); ++i)//用 != 比较两个迭代器cout << *i << " ";cout << endl << "第 2 种遍历方法:" << endl;for (i = v.begin(); i < v.end(); ++i) //用 < 比较两个迭代器cout << *i << " ";cout << endl << "第 3 种遍历方法:" << endl;i = v.begin();while (i < v.end()) {cout << *i << " ";i += 2; // 随机访问迭代器支持 "+= 整数"  的操作}
}

在这里插入图片描述

4.3 auto关键字 自动指定迭代器定义类型

#include <iostream>
#include <vector>
using namespace std;int main()
{vector <int> vec = { 1, 2,3, 4 ,5 };auto t = vec.begin();for (; t != vec.end(); ++t)cout << *t << " ";return 0;
}

在这里插入图片描述

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

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

相关文章

C++内存池

原理就是一个内存池内部拥有的空间为POOL_SIZE个自己。 #include<iostream>using namespace std;class DemoClass{ public:DemoClass() default;DemoClass(int i):data(i){}static void * operator new(size_t size);static void operator delete(void * p);virtual ~D…

【Qt】:常用控件(四:显示类控件)

常用控件 一.Lable二.LCD Number 一.Lable QLabel 可以⽤来显⽰⽂本和图⽚. 代码⽰例:显⽰不同格式的⽂本 代码⽰例:显⽰图⽚ 此时,如果拖动窗⼝⼤⼩,可以看到图⽚并不会随着窗⼝⼤⼩的改变⽽同步变化 为了解决这个问题,可以在Widget中重写resizeEvent函数。当用户把窗口从A拖…

点云的Python均值采样

一、代码 Python import numpy as np import open3d as o3ddef mean_sampling(point_cloud, num_samples=None, depth=None, method=knn, k=10):"""对点云进行均值下采样。:param point_cloud: Open3D PointCloud对象:param num_samples: (仅当method=knn时使…

机器学习——典型的卷积神经网络

机器学习——典型的卷积神经网络 卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNNs&#xff09;是一类在图像处理领域应用广泛的深度学习模型。它通过卷积操作和池化操作来提取图像的特征&#xff0c;并通过全连接层来进行分类或回归任务。在本文中&am…

开源项目-CSDN专栏

CSDN博主 单片机 毕业设计 物联网 嵌入式

基于单片机双路压力监测报警系统

**单片机设计介绍&#xff0c;基于单片机双路压力监测报警系统 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机双路压力监测报警系统是一个专门设计用于实时监测和报警两路压力变化的系统。它结合了单片机控制技术和压…

图DP

目录 有向无环图DP 力扣 329. 矩阵中的最长递增路径 力扣 2192. 有向无环图中一个节点的所有祖先 有向有环图DP 力扣 1306. 跳跃游戏 III 有向无环图DP 力扣 329. 矩阵中的最长递增路径 给定一个 m x n 整数矩阵 matrix &#xff0c;找出其中 最长递增路径 的长度。 对…

【DA-CLIP】test.py解读,调用DA-CLIP和IRSDE模型复原计算复原图与GT图SSIM、PSNR、LPIPS

文件路径daclip-uir-main/universal-image-restoration/config/daclip-sde/test.py 代码有部分修改 导包 import argparse import logging import os.path import sys import time from collections import OrderedDict import torchvision.utils as tvutilsimport numpy as…

数学知识--(质数,约数)

本文用于个人算法竞赛学习&#xff0c;仅供参考 目录 一.质数的判定 二.分解质因数 三.质数筛 1.朴素筛法 2.埃氏筛法 3.线性筛法 四.约数 1.求一个数的所有约数 2.约数个数和约数之和 3.欧几里得算法&#xff08;辗转相除法&#xff09;-- 求最大公约数 一.质数的判定 …

新型智慧城市大数据解决方案(附下载)

随着云计算、大数据、移动互联网等技术的发展&#xff0c;由城市运行产生的交通、环境、市政、商业等各领域数据量巨大&#xff0c;这些数据经过合理的分析挖掘可产生大量传统数据不能反映的城市运行信息&#xff0c;已成为智慧城市的重要资产。 在大数据时代&#xff0c;数据信…

理解main方法的语法

由于JVM需要调用类的main()方法&#xff0c;所以该方法的访问权限必须是public&#xff0c;又因为JVM在执行main()方法时不必创建对象&#xff0c;所以该方法必须是static的&#xff0c;该方法接收一个String类型的数组参数&#xff0c;该数组中保存执行Java命令时传递给所运行…

问题解决:写CSDN博文时图片大小不适应,不清晰,没法排版

项目环境&#xff1a; Window10&#xff0c;Edge123.0.2420.65 问题描述&#xff1a; 当我在CSDN写博文的时候&#xff0c;会经常插入一些图片&#xff0c;但有时候我插入的图片太大了&#xff0c;影响了整体排版。 比如我加入了一张图片&#xff0c;就变成了下面这个样子&…

释放 ChatGPT4 的威力

原文&#xff1a;Unleashing the Power of ChatGPT-4: Strategies for Building a Personal Income Stream 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 I. 介绍 在当今快速发展的数字领域中&#xff0c;人工智能&#xff08;AI&#xff09;已经成为无数行业的重要…

Kubernetes探索-Deployment面试

1. 简述Deployment的升级策略 在Deployment的定义中&#xff0c;可以通过spec.strategy指定Pod更新的策略&#xff0c;目前支持两种策略&#xff1a;Recreate&#xff08;重建&#xff09;和RollingUpdate&#xff08;滚动更新&#xff09;&#xff0c;默认值为RollingUpdate。…

PEFT-LISA

LISA是LoRA的简化版&#xff0c;但其抓住了LoRA微调的核心&#xff0c;即LoRA侧重更新LLM的底层embedding和顶层head。 根据上述现象&#xff0c;LISA提出两点改进&#xff1a; 始终更新LLM的底层embedding和顶层head随机更新中间层的hidden state 实验结果 显存占用 毕竟模型…

RAMS (Mesoscale Model System) 和 WRF 区别

历史和发展&#xff1a; RAMS&#xff1a;RAMS 最早于1970年代由美国科罗拉多州立大学开发&#xff0c;并在之后几十年不断发展壮大。它是最早用于模拟地区尺度大气动力学、热力学和降水过程的模型之一。WRF&#xff1a;WRF 是由美国国家大气研究中心&#xff08;NCAR&#xff…

openstack云计算(一)————openstack安装教程,创建空白虚拟机,虚拟机的环境准备

1、创建空白虚拟机 需要注意的步骤会截图一下&#xff0c;其它的基本都是下一步&#xff0c;默认的即可 ----------------------------------------------------------- 2、在所建的空白虚拟机上安装CentOS 7操作系统 &#xff08;1&#xff09;、在安装CentOS 7的启动界面中…

RuoYi-Vue若依框架-集成mybatis-plus报错Unknown column ‘search_value‘ in ‘field list‘

报错信息 ### Error querying database. Cause: java.sql.SQLSyntaxErrorException: Unknown column search_value in field list ### The error may exist in com/ruoyi/sales/mapper/ZcSpecificationsMapper.java (best guess) ### The error may involve defaultParameter…

C++之STL的algorithm(6)之排序算法(sort、merge)整理

C之STL的algorithm&#xff08;6&#xff09;之排序算法&#xff08;sort、merge&#xff09;整理 注&#xff1a;整理一些突然学到的C知识&#xff0c;随时mark一下 例如&#xff1a;忘记的关键字用法&#xff0c;新关键字&#xff0c;新数据结构 C 的排序算法整理 C之STL的al…

Oracle数据库——分组函数四

12.1什么是分组函数 分组函数作用于一组数据,并对一组数据返回一个值。例如求平均数,最大值等等。 1.组函数类型 AVG :求平均数COUNT :COUNT(expr) 返回expr不为空的记录总数。 MAX 求最大值MIN