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

STL 2迭代器

文章目录

    • 1.迭代器
    • 2.输入迭代器
    • 3.输出迭代器
      • 1.插入迭代器
    • 4.前向迭代器
    • 5.双向迭代器
    • 6.随机访问迭代器
    • 7.不同容器返回的迭代器类型
      • 1.输入 / 输出迭代器
      • 2.前向迭代器
      • 3.双向迭代器
      • 4.随机访问迭代器
      • 5.特殊迭代器适配器
      • 6.为什么 unordered_set 只提供前向迭代器?

1.迭代器

1.迭代器
1.抽象的指针:迭代器是一种行为类似指针的对象,提供对容器元素的间接访问。
2.统一接口:通过迭代器,算法可以操作任意容器(如 vector、list、map),无需关心容器的底层实现。

2 核心作用
1.遍历容器:替代直接操作容器内部结构,简化代码。
2.算法复用:STL 算法(如 std::sort、std::find)通过迭代器操作数据,不依赖具体容器。

2.输入迭代器

输入迭代器是迭代器分类中功能最弱的类型,其设计目标是单遍读取数据,具有以下特点:
std::istream_iterator

1.支持的操作:
1.自增操作(++it 或 it++):移动到下一个元素。
2.解引用(*it):读取当前元素的值(返回右值,不可修改)。
3.相等性比较(== 和 !=):判断两个迭代器是否指向同一位置。

2.关键限制
1.不可重复读取:同一元素只能通过迭代器读取一次,多次解引用行为未定义(类似输入流)。
2.不可写操作:不能通过 *it 修改元素值(解引用结果为右值)。
3.不支持反向移动:无法通过 – 回到前一个元素。

3.输出迭代器

输出迭代器是迭代器分类中用于单遍写入数据的接口,其设计目标是高效地将数据写入目标位置。它具有以下特点:
ostream_iterator
1.支持的操作
1.自增操作(++it 或 it++):移动到下一个写入位置。
2.解引用赋值(*it = value):将值写入当前位置。
3.注意:输出迭代器的解引用结果必须是可修改的左值(Lvalue)。

2.关键限制
1.不可读取:不支持通过 *it 读取元素值,仅用于写入。
2.单遍写入:同一位置只能写入一次,多次写入行为未定义。
3.不支持反向移动:无法通过 – 回到前一个位置。

1.插入迭代器

插入迭代器(Insert Iterator)是输出迭代器(Output Iterator)的具体实现,二者的关系可概括为:
1.插入迭代器继承了输出迭代器的接口,并扩展了容器插入元素的能力。

2.常见插入迭代器
1.尾插迭代器(std::back_inserter)
适配容器:需支持 push_back()(如 vector、deque、list)。
2.头插迭代器(std::front_inserter)
适配容器:需支持 push_front()(如 list、deque)。
3.任意位置插入迭代器(std::inserter)
适配容器:需支持 insert(pos, value)(如所有标准容器)。

4.前向迭代器

前向迭代器是 STL 迭代器分类中的一种,它在输入 / 输出迭代器的基础上支持多次读写,并具有以下特点:
forward_list、unordered_set

1.支持的操作
1.输入迭代器的全部操作:自增(++)、解引用读取(*it)、相等比较(==/!=)。
2.输出迭代器的全部操作:解引用写入(*it = value)。
3.多次遍历:可保存迭代器状态并重复使用(如多次解引用同一位置)。

2.关键限制
1.单向移动:仅支持 ++ 操作,无法通过 – 回到前一个位置。
2.不支持随机访问:不能直接跳跃到任意位置(如 it + 5)。
前向迭代器适用于单向链表、哈希表等只能单向遍历的数据结构,
单向链表(std::forward_list)

5.双向迭代器

双向迭代器是 STL 迭代器分类中的一种,它在前向迭代器的基础上增加了反向移动能力,具有以下特点:
list、set、map
1.支持的操作
1.前向迭代器的全部操作:自增(++)、解引用读写(*it、*it = value)、多次遍历。
2.反向移动:支持递减操作(–it 或 it–),可向前遍历。

2.关键限制
1.不支持随机访问:无法直接跳跃到任意位置(如 it + 5),只能逐个移动。
2.必须成对使用 ++ 和 --:例如,若从 begin() 开始,必须通过 – 回到 begin() 之前的位置(如 rend())。

6.随机访问迭代器

随机访问迭代器是 STL 迭代器分类中功能最强的类型,它在双向迭代器的基础上增加了随机访问能力,具有以下特点:
vector、deque、原生数组

1.支持的操作
1.双向迭代器的全部操作:自增(++)、自减(–)、解引用读写(*it、*it = value)。
2.随机位置跳转:支持 +=、-=、+、- 操作(如 it += 5 直接跳到第 5 个位置)。
3.位置比较:支持 <、>、<=、>= 比较迭代器位置。
4.下标访问:支持 it[n] 语法(等价于 *(it + n))。

2.时间复杂度:所有操作均为 O (1)。

7.不同容器返回的迭代器类型

1.输入 / 输出迭代器

这类迭代器通常由适配器或流对象生成,而非直接来自容器:

2.前向迭代器

std::forward_list
std::unordered_set
std::unordered_map

3.双向迭代器

std::list
std::set
std::map
std::multiset
std::multimap

4.随机访问迭代器

std::vector
std::deque
std::array

5.特殊迭代器适配器

由算法或适配器生成的迭代器,
std::reverse_iterator
std::back_inserter
std::front_inserter
std::inserter

6.为什么 unordered_set 只提供前向迭代器?

哈希表的元素存储顺序不确定,且遍历时通常按桶的顺序访问,因此不支持双向移动。

http://www.xdnf.cn/news/13235.html

相关文章:

  • rknn toolkit2搭建和推理
  • DL00871-基于深度学习YOLOv11的盲人障碍物目标检测含完整数据集
  • C++11作用域枚举(Scoped Enums):从入门到精通
  • AI书签管理工具开发全记录(十九):嵌入资源处理
  • 自然语言处理——Transformer
  • LTR-381RGB-01RGB+环境光检测应用场景及客户类型主要有哪些?
  • Android15默认授权浮窗权限
  • 驭码CodeRider 2.0全栈开发实战指南:从零构建现代化电商平台
  • 【若依】框架项目部署笔记
  • LabVIEW双光子成像系统技术
  • 力扣热题100 k个一组反转链表题解
  • 由于 z(x,y) 的变化导致的影响(那部分被分给了链式项)
  • 实现自动化管理、智能控制、运行服务的智慧能源开源了。
  • Spring MVC执行流程简介
  • rnn判断string中第一次出现a的下标
  • ESP32开发之WS2812B控制
  • 前端性能优化-虚拟滚轮(Virtual Scroll)
  • nuclio
  • Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
  • [拓扑优化] 1.概述
  • 【http解析——三个版本对比】
  • 【Qt】控件 QWidget
  • 解决Excel词典(xllex.dll)文件丢失或损坏问题的终极指南:从基础到高级修复技巧
  • Netty
  • 嵌入式学习之系统编程(八)IPC、管道(有名与无名)和信号通信(6.3)
  • Python 训练 day46
  • 2.8 C/C++开发环境:VSCode+CMake+VS2017
  • 有关文心一言禁止浏览器开启调式工具的问题帖子汇总
  • uniapp实现的具备丝滑动画的标签工具栏模板
  • Linux中shell流程控制语句