c++ 迭代器分类及详细讲解

c++ 迭代器分类及详细讲解

      • 迭代器分类及详细讲解
        • 1. 输入迭代器(Input Iterator)
        • 2. 输出迭代器(Output Iterator)
        • 3. 前向迭代器(Forward Iterator)
        • 4. 双向迭代器(Bidirectional Iterator)
        • 5. 随机访问迭代器(Random Access Iterator)
      • 总结

迭代器分类及详细讲解

迭代器是C++标准库中用于访问容器元素的通用接口。不同类型的迭代器提供了不同的功能,泛型算法可以根据迭代器的类型进行优化。以下是迭代器的分类及其典型应用:

1. 输入迭代器(Input Iterator)
  • 功能:只能读取元素,且只能单向递增(即只能向前移动)。
  • 操作:支持 *it(解引用)、it->(访问成员)、++it(前置递增)、it++(后置递增)、it1 == it2(比较相等)、it1 != it2(比较不等)。
  • 典型应用find 算法。
  • 例子
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        auto it = std::find(vec.begin(), vec.end(), 3);
        if (it != vec.end()) {
            std::cout << "Found: " << *it << std::endl;
        } else {
            std::cout << "Not found" << std::endl;
        }
        return 0;
    }
    
    在这个例子中,find 算法使用输入迭代器遍历容器,查找值为 3 的元素。
2. 输出迭代器(Output Iterator)
  • 功能:只能写入元素,且只能单向递增。
  • 操作:支持 *it = value(赋值)、++it(前置递增)、it++(后置递增)。
  • 典型应用copy 算法。
  • 例子
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> src = {1, 2, 3, 4, 5};
        std::vector<int> dst(5);
        std::copy(src.begin(), src.end(), dst.begin());
        for (int i : dst) {
            std::cout << i << " ";
        }
        return 0;
    }
    
    在这个例子中,copy 算法使用输出迭代器将 src 中的元素复制到 dst 中。
3. 前向迭代器(Forward Iterator)
  • 功能:可读写元素,且只能单向递增。
  • 操作:支持输入迭代器和输出迭代器的所有操作,且可以多次遍历同一范围。
  • 典型应用replace 算法。
  • 例子
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        std::replace(vec.begin(), vec.end(), 3, 99);
        for (int i : vec) {
            std::cout << i << " ";
        }
        return 0;
    }
    
    在这个例子中,replace 算法使用前向迭代器遍历容器,并将所有值为 3 的元素替换为 99
4. 双向迭代器(Bidirectional Iterator)
  • 功能:可读写元素,且可以双向移动(递增和递减)。
  • 操作:支持前向迭代器的所有操作,且支持 --it(前置递减)、it--(后置递减)。
  • 典型应用reverse 算法。
  • 例子
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> vec = {1, 2, 3, 4, 5};
        std::reverse(vec.begin(), vec.end());
        for (int i : vec) {
            std::cout << i << " ";
        }
        return 0;
    }
    
    在这个例子中,reverse 算法使用双向迭代器将容器中的元素逆序。
5. 随机访问迭代器(Random Access Iterator)
  • 功能:可读写元素,且可以在常数时间内移动任意距离。
  • 操作:支持双向迭代器的所有操作,且支持 it + nit - nit += nit -= nit1 - it2it[n]it1 < it2 等操作。
  • 典型应用sort 算法。
  • 例子
    #include <iostream>
    #include <vector>
    #include <algorithm>
    
    int main() {
        std::vector<int> vec = {5, 3, 1, 4, 2};
        std::sort(vec.begin(), vec.end());
        for (int i : vec) {
            std::cout << i << " ";
        }
        return 0;
    }
    
    在这个例子中,sort 算法使用随机访问迭代器对容器中的元素进行排序。

总结

迭代器的分类决定了它们的功能和性能特性。泛型算法通过利用迭代器的不同类型来实现高效的操作。理解迭代器的分类及其典型应用,有助于编写高效且通用的C++代码。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【编程题】7-3 树的同构

7-3 树的同构 1 题目原文2 思路解析3 代码实现4 总结 1 题目原文 题目链接&#xff1a;7-3 树的同构 给定两棵树 T 1 T_1 T1​ 和 T 2 T_2 T2​​。如果 T 1 T_1 T1​ 可以通过若干次左右孩子互换就变成 T 2 T_2 T2​&#xff0c;则我们称两棵树是“同构”的。例如图 1 1 …

WebP2P技术在嵌入式设备中的应用:EasyRTC音视频通话SDK如何实现高效通信?

在数字化时代&#xff0c;实时通信技术&#xff08;RTC&#xff09;与人工智能&#xff08;AI&#xff09;的融合正在重塑各个行业的交互方式。从在线教育到远程医疗&#xff0c;从社交娱乐到企业协作&#xff0c;RTC的应用场景不断拓展。然而&#xff0c;传统的RTC解决方案往往…

【前端】前端设计中的响应式设计详解

文章目录 前言一、响应式设计的定义与作用二、响应式设计的原则三、响应式设计的实现四、响应式设计的最佳实践总结 前言 在当今数字化时代&#xff0c;网站和应用程序需要适应各种设备&#xff0c;从桌面电脑到平板电脑和手机。响应式设计应运而生&#xff0c;成为一种可以适…

【AVRCP】探寻AVRCP控制互操作性:连接、命令与设备交互

AVRCP对于实现设备间的高效音频/视频控制至关重要。而控制互操作性要求作为AVRCP的核心部分&#xff0c;详细规定了设备在连接建立、命令传输等方面的具体操作。确保了不同设备之间能够实现无缝的远程控制。 一、AVCTP连接管理 1.1 AVCTP连接建立 发起者&#xff1a;AVCTP控制…

LLM大型语言模型(一)

1. 什么是 LLM&#xff1f; LLM&#xff08;大型语言模型&#xff09;是一种神经网络&#xff0c;专门用于理解、生成并对人类文本作出响应。这些模型是深度神经网络&#xff0c;通常训练于海量文本数据上&#xff0c;有时甚至覆盖了整个互联网的公开文本。 LLM 中的 “大” …

2025国家护网HVV高频面试题总结来了04(题目+回答)

网络安全领域各种资源&#xff0c;学习文档&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具&#xff0c;欢迎关注。 一、HVV行动面试题分类 根据面试题的内容&#xff0c;我们将其分为以下几类&#xff1a; 漏洞利用与攻击技术 …

解锁GPM 2.0「卡顿帧堆栈」|代码示例与实战分析

每个游戏开发者都有一个共同的愿望&#xff0c;那就是能够在无需复现玩家反馈的卡顿现象时&#xff0c;快速且准确地定位卡顿的根本原因。为了实现这一目标&#xff0c;UWA GPM 2.0推出了全新功能 - 卡顿帧堆栈&#xff0c;旨在为开发团队提供高效、精准的卡顿分析工具。在这篇…

【人工智能】蓝耘智算平台盛大发布DeepSeek满血版:开创AI推理体验新纪元

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀ 蓝耘智算平台 蓝耘智算平台核心技术与突破元生代推理引擎快速入门&#xff1a;三步调用大模型接口&#xff0c;OpenAI SDK无缝兼容实战用例文…

用Python+Flask打造可视化武侠人物关系图生成器:从零到一的实战全记录

用PythonFlask打造可视化武侠人物关系图生成器&#xff1a;从零到一的实战全记录 一、缘起&#xff1a;一个程序小白的奇妙探索之旅 作为一个接触Python仅13天的编程萌新&#xff0c;我曾以为开发一个完整的应用是遥不可及的事情。但在DeepSeek的帮助下&#xff0c;我竟用短短…

Mac远程桌面软件哪个好用?

远程桌面软件能帮助我们快速的远程控制另一台电脑&#xff0c;从而提供远程帮助&#xff0c;或者进行远程办公。那么&#xff0c;对macOS系统有什么好用的Mac远程桌面软件呢&#xff1f; 远程看看是一款操作简单、界面简洁的远程桌面软件&#xff0c;支持跨平台操作&#xff0…

华为云 | 快速搭建DeepSeek推理系统

DeepSeek&#xff08;深度求索&#xff09;作为一款国产AI大模型&#xff0c;凭借其高性能、低成本和多模态融合能力&#xff0c;在人工智能领域崛起&#xff0c;并在多个行业中展现出广泛的应用潜力。 如上所示&#xff0c;在华为云解决方案实践中&#xff0c;华为云提供的快速…

Unity 内置渲染管线各个Shader的用途和性能分析,以及如何修改Shader(build in shader 源码下载)

文章目录 所有Shader分析路径&#xff1a;Standard路径&#xff1a;Nature/路径&#xff1a;UI/路径&#xff1a;Particles/Particles/Standard SurfaceParticles/Standard Unlit 路径&#xff1a;Unlit/Unlit/TextureUnlit/ColorUnlit/TransparentUnlit/Transparent CutoutUnl…

概率分布与概率密度

前言 本文隶属于专栏《机器学习数学通关指南》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见《机器学习数学通关指南》 正文 &#x1f50d; 1. 概率分布基…

【C++】类与对象:深入理解默认成员函数

类与对象&#xff1a;深入理解默认成员函数 引言1、默认成员函数概述2、构造函数与析构函数2.1 默认构造函数2.2 析构函数 3、拷贝控制成员3.1 拷贝构造函数3.2 赋值运算符重载 4、移动语义&#xff08;C11&#xff09;4.1 移动构造函数4.2 移动赋值运算符 5、三五法则与最佳实…

LINUX网络基础 - 网络编程套接字,UDP与TCP

目录 前言 一. 端口号的认识 1.1 端口号的作用 二. 初识TCP协议和UDP协议 2.1 TCP协议 TCP的特点 使用场景 2.2 UDP协议 UDP的特点 使用场景 2.3 TCP与UDP的对比 2.4 思考 2.5 总结 三. 网络字节序 3.1 网络字节序的介绍 3.2 网络字节序思考 四. socket接口 …

夸父工具箱(安卓版) 手机超强工具箱

如今&#xff0c;人们的互联网活动日益频繁&#xff0c;导致手机内存即便频繁清理&#xff0c;也会莫名其妙地迅速填满&#xff0c;许多无用的垃圾信息悄然占据空间。那么&#xff0c;如何有效应对这一难题呢&#xff1f;答案就是今天新推出的这款工具软件&#xff0c;它能从根…

Apache nifi demo 实验

Apache nifi 是个数据流系统&#xff0c;可以通过配置 自定义的流程来实现数据的转换。 比如可以配置一个流程&#xff0c;读取数据库里的数据&#xff0c;再转换&#xff0c;最后保存到本地文件。 这样可以来实现一些数据转换的操作&#xff0c;而不用特地编写程序来导入导出。…

VSCode知名主题带毒 安装量900万次

目前微软已经从 Visual Studio Marketplace 中删除非常流行的主题扩展 Material Theme Free 和 Material Theme Icons&#xff0c;微软称这些主题扩展包含恶意代码。 统计显示这些扩展程序的安装总次数近 900 万次&#xff0c;在微软实施删除后现在已安装这些扩展的开发者也会…

Java自动拆箱装箱/实例化顺序/缓存使用/原理/实例

在 Java 编程体系中&#xff0c;基本数据类型与包装类紧密关联&#xff0c;它们各自有着独特的特性和应用场景。理解两者之间的关系&#xff0c;特别是涉及到拆箱与装箱、实例化顺序、区域问题、缓存问题以及效率问题。 一、为什么基本类型需要包装类 泛型与集合的需求 Java…

蓝桥杯复盘记录004(2023)

涉及知识点 1.深搜 2.单调队列滑动窗口 3.位运算 4.并查集 题目 1.lanqiao3505 思路&#xff1a; dfs(index, weight, cnt) index表示瓜的索引&#xff0c; weight等于买瓜的重量&#xff0c; cnt表示买了多少瓜。 递归终止条件&#xff1a;1.如果瓜买完了&#xff0c;归…