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

迭代器的思想和实现细节

1. 迭代器的本质

迭代器是一种行为类似指针的对象,它可能是指针(如 std::vector 的迭代器),也可能是封装了指针的类(如 std::list 的迭代器)。如果是指针那天然就可以用下面的运算,如果是类,就要重载下面的运算符:

  • *iter:获取元素的引用。  (解引用运算符)

  • iter->member:访问元素的成员(若元素是对象)。    (成员访问运算符)

  • ++iter / --iter:指针移动到下一个/上一个元素。

2.迭代器的 -> 行为

迭代器如果是类对象(非指针),需要重载 operator->()。标准规定:

  • 当写 it->member 时,编译器会编指令编成:

    1. 调用 it.operator->(),获取一个 元素的指针(比如 T*)。

    2. 对元素的指针 自动再调用 ->,最终访问成员。

伪代码演示

cpp

// 假设迭代器类内部:
class ListIterator {Node* current; // 节点指针
public:// 重载 ->Person* operator->() { return &(current->data); // 返回对象指针}
};// 使用时:
it->name;
// 实际展开:
(it.operator->())->name; // 调用 it.operator->(),获取一个 元素的指针(比如 T*)。元素指针 再调用 ->,最终访问成员。


 标准库中的真实案例

(1) std::list 的迭代器实现(GCC)

cpp

// 简化版的 list 迭代器
template<typename _Tp>
struct _List_iterator {_List_node* _M_node; // 节点指针_Tp* operator->() const {return &(_M_node->_M_data); // 返回数据对象的指针}
};// 使用时:
std::list<Person>::iterator it = people.begin();
it->age; // 实际等价于:(it. operator->())->age

相关文章:

  • 【计算机视觉】三维重建: OpenMVS:工业级多视图立体视觉重建框架
  • 腾讯混元-DiT 文生图
  • 基于Jenkins的DevOps工程实践之Jenkins共享库
  • Python 数据智能实战 (10):智能商品推荐 - LLM “猜你喜欢”
  • ES6语法
  • 驱动精灵v9.7(含网卡版)驱动工具软件下载及安装教程
  • MySQL 日期加减函数详解
  • 进程间通信(IPC)
  • sql 注入中的万能密码
  • iOS启动优化:从原理到实践
  • ActiveMQ 集群搭建与高可用方案设计(二)
  • 大数据:数字时代的驱动力
  • 数据库原理与应用实验二 题目七
  • Oracle 11g通过dg4odbc配置dblink连接神通数据库
  • 前端面试每日三题 - Day 23
  • 多数据源动态切换
  • HTML简介
  • ​​信息泄露:网站敏感文件泄漏的隐形危机与防御之道​
  • 高性能架构设计-高可用
  • 专为焦油介质打造:煤焦油专用气动硬密封调节 V 型球阀(带手动)的卓越特点-耀圣
  • 抗战回望20︱《山西省战区抗敌行政工作检讨会议议决案》:“强民政治”、“说服行政”
  • 李云泽:对受关税影响较大、经营暂时困难的市场主体,一企一策提供精准服务
  • 青年与城市共成长,第六届上海创新创业青年50人论坛将举办
  • 践行自由贸易主义理念,加快区域合作进程
  • 特朗普:对所有在国外制作进入美国的电影征收100%关税
  • 新华每日电讯头版聚焦上海:科创高地向未来