c++ STL标准模板库-迭代器

C++ STL中的迭代器是用于遍历容器元素的抽象接口。迭代器允许算法独立于容器的具体类型,提供了一种统一的方式来访问容器中的元素。以下是迭代器的一些基本类型和操作的简要介绍,以及相应的操作示例。

迭代器的分类

  1. 输入迭代器(Input Iterators):只能单次读取元素,不能修改元素。
  2. 输出迭代器(Output Iterators):只能单次写入元素,不能读取元素。
  3. 前向迭代器(Forward Iterators):可以读取和修改元素,支持多次遍历。
  4. 双向迭代器(Bidirectional Iterators):除了前向迭代器的功能外,还支持向后遍历。
  5. 随机访问迭代器(Random Access Iterators):支持随机访问,可以快速跳转到任意位置,支持所有双向迭代器的操作,并且可以进行索引操作。

迭代器的基本操作

  • 解引用(Dereference)*iter 获取迭代器指向的元素。
  • 成员访问(Arrow)iter->member 访问迭代器指向的元素的成员。
  • 前缀递增(Prefix Increment)++iter 将迭代器向前移动到下一个元素。
  • 后缀递增(Postfix Increment)iter++ 将迭代器向前移动到下一个元素,但返回移动前的迭代器值。
  • 前缀递减(Prefix Decrement)--iter 将迭代器向后移动到上一个元素(双向和随机访问迭代器)。
  • 后缀递减(Postfix Decrement)iter-- 将迭代器向后移动到上一个元素,但返回移动前的迭代器值(双向和随机访问迭代器)。
  • 相等性比较(Equality)iter1 == iter2 检查两个迭代器是否相等。
  • 不等性比较(Inequality)iter1 != iter2 检查两个迭代器是否不相等。
  • 距离计算(Distance)std::distance(iter1, iter2) 计算两个迭代器之间的距离(随机访问迭代器)。
  • 索引访问(Subscript)iter[n] 通过索引访问元素(随机访问迭代器)。

迭代器操作示例

输入迭代器(Input Iterators)

// 输入迭代器只能进行单次读取,不能进行写入操作
auto it = container.begin();
while (it != container.end()) {std::cout << *it; // 解引用读取元素++it;             // 前缀递增
}

输出迭代器(Output Iterators)

// 输出迭代器只能进行单次写入,不能进行读取操作
auto it = container.begin();
int values[] = {1, 2, 3, 4, 5};
std::copy(values, values + 5, it); // 使用copy算法写入元素

前向迭代器(Forward Iterators)

// 前向迭代器可以进行多次读取和写入操作
auto it = container.begin();
while (it != container.end()) {*it = 10; // 解引用写入元素++it;     // 前缀递增
}

双向迭代器(Bidirectional Iterators)

// 双向迭代器除了可以单向遍历外,还可以反向遍历
auto it = container.begin();
++it;                // 前缀递增
--it;                // 前缀递减
*it = 10;            // 解引用写入元素
auto prev = it++;   // 后缀递增
*prev = 20;         // 使用后缀递增返回的迭代器解引用写入元素

随机访问迭代器(Random Access Iterators)

// 随机访问迭代器支持随机访问,可以快速跳转到任意位置
auto it = container.begin();
std::cout << *(it + 2) << std::endl;             // 索引访问
std::cout << *(it - 1) << std::endl;             // 索引访问(反向)
std::cout << it[2] << std::endl;                 // 索引访问(另一种形式)
std::cout << (it + 2 == container.end() - 1) << std::endl; // 相等性比较
std::cout << (it - it == 0) << std::endl;        // 距离计算(总是0)

请注意,这些示例假设container是一个有效的STL容器实例,且int类型的值可以存储在其中。实际使用时,你需要根据容器的类型和元素的类型来调整代码。此外,输出迭代器通常不提供递增和递减操作,因为它们不支持读取操作。

在C++ STL中,迭代器、容器和算法之间存在着紧密的关系,它们共同构成了STL的三大核心组件。下面详细解释这三者之间的关系:

容器、迭代器和算法之间的关系

容器(Containers)

容器是用来存储数据的,它们可以容纳一系列元素。STL提供了多种容器,例如 std::vectorstd::liststd::mapstd::set 等。每个容器都有其特定的结构和性能特点,例如 std::vector 提供了动态数组的功能,而 std::list 提供了双向链表的功能。

迭代器(Iterators)

迭代器是一种泛型接口,用于遍历容器中的元素。它们提供了一种抽象层,允许算法以统一的方式访问容器中的元素,而不需要关心容器的内部实现。迭代器的种类(如输入迭代器、前向迭代器、双向迭代器和随机访问迭代器)反映了它们可以进行的操作和性能特征。

算法(Algorithms)

STL算法是一系列在容器上操作的函数模板,例如 std::sortstd::findstd::transform 等。这些算法通常接受迭代器作为参数,这意味着它们可以在任何类型的容器上工作,只要该容器提供了合适的迭代器。算法的实现通常依赖于迭代器来访问和操作容器中的元素。

迭代器和容器的关系

  • 访问元素:迭代器提供了一种方式来访问容器中的元素,无论是读取还是修改。
  • 遍历容器:迭代器允许算法遍历容器中的所有元素,而不需要知道容器的内部结构。
  • 容器无关性:迭代器的引入使得算法可以独立于容器的具体类型,增强了算法的通用性。

迭代器和算法的关系

  • 算法实现:算法通常通过迭代器来实现,它们使用迭代器来访问和操作容器中的元素。
  • 性能保证:迭代器的种类(如随机访问迭代器)可以提供关于算法性能的保证,例如 std::sort 算法在随机访问迭代器上可以提供较好的性能。
  • 泛型编程:迭代器使得算法可以以泛型的方式编写,这意味着同一个算法可以用于不同类型的容器。

容器和算法的关系

  • 容器操作:算法提供了对容器进行操作的功能,如排序、搜索、变换等。
  • 容器抽象:容器提供了数据的存储和管理,而算法提供了对这些数据的操作,两者相辅相成。
  • 容器适配:某些算法需要特定类型的迭代器,因此容器必须提供这些迭代器才能使用这些算法。

总的来说,迭代器作为容器和算法之间的桥梁,使得STL的组件可以以一种灵活和高效的方式协同工作。这种设计使得STL既强大又灵活,能够适应各种不同的编程需求。

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

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

相关文章

浏览器控制的无线开关

esp32-c3 作为HTTP server 控制led 灯。服务器注册两个uri 。一个"/open" 控制开&#xff0c;一个"/close"控制关。下一步再用一片c3作为客户端&#xff0c;运行http client 发送/open. /Close 模拟浏览器&#xff0c;控制led. 其实只要用手机或pc或平…

Apache Lucene 10 已发布!Lucene 硬件效率改进及其他改进

作者&#xff1a;来自 Elastic Adrien Grand Apache Lucene 10 刚刚发布&#xff0c;重点关注硬件效率&#xff01;查看主要版本亮点。 Apache Lucene 10 终于发布了&#xff01;自 Lucene 9.0&#xff08;于 2021 年 12 月发布&#xff0c;距今已有近 3 年&#xff09;以来&a…

C++20中头文件source_location的使用

<source_location>是C20中新增加的头文件&#xff0c;此头文件是utility库的一部分。 主要内容为类std::source_location&#xff1a;表示有关源代码的某些信息&#xff0c;例如文件名(__FILE__)、行号(__LINE__)和函数名(__func__)。 以下为测试代码&#xff1a; names…

Redis 高可用:从主从到集群的全面解析

目录 一、主从复制 (基础)1. 同步复制a. 全量数据同步b. 增量数据同步c. 可能带来的数据不一致 2. 环形缓冲区a. 动态调整槽位 3. runid4. 主从复制解决单点故障a. 单点故障b. 可用性问题 5. 注意事项a. Replica 主动向 Master 建立连接b. Replica 主动向 Master 拉取数据 二、…

Vue+TypeScript+SpringBoot的WebSocket基础教学

成品图&#xff1a; 对WebSocket的理解&#xff08;在使用之前建议先了解Tcp&#xff0c;三次握手&#xff0c;四次挥手 &#xff09;&#xff1a; 首先页面与WebSocket建立连接、向WebSocket发送信息、后端WebSocket向所有连接上WebSoket的客户端发送当前信息。 推荐浏览网站…

【网络原理】HTTP协议

目录 前言 一.什么是HTTP HTTP报文格式 HTTP的请求格式 1.首行 2.请求头&#xff08;header&#xff09; 3.空行 4.正文&#xff08;body&#xff09; HTTP的响应格式 1.首行 2.响应头 3.空行 4.正文&#xff08;body&#xff09; 首行中的方法 GET和POST的区别 …

linux中级wed服务器(https搭建加密服务器)

一。非对称加密算法&#xff1a; 公钥&#xff1a;公共密钥&#xff0c;开放 私钥&#xff1a;私有密钥&#xff0c;保密 1.发送方用自己的公钥加密&#xff0c;接受方用发送方的私钥解密&#xff1a;不可行 2.发送方用接受方的公钥加密&#xff0c;接受方用自己的私钥解密…

基于yolov10的驾驶员抽烟打电话安全带检测系统python源码+pytorch模型+评估指标曲线+精美GUI界面

【算法介绍】 基于YOLOv10的驾驶员抽烟、打电话、安全带检测系统是一种先进的驾驶行为监测系统。该系统利用YOLOv10算法的高效性和准确性&#xff0c;实现对驾驶员行为的实时检测与识别。 YOLOv10是一种最新的实时物体检测模型&#xff0c;其通过深度学习技术&#xff0c;如卷…

spark统一内存模型 详解

Apache Spark 是一个用于大规模数据处理的分布式计算框架&#xff0c;它支持多种处理模型&#xff08;如批处理、流处理、SQL、机器学习等&#xff09;。为了高效地在分布式环境中处理这些多样化的工作负载&#xff0c;Spark 在 2.x 版本后引入了统一内存管理模型&#xff0c;以…

Mycat2安装配置

安装配置 安装 目前Mycat2下载地址已经不可访问&#xff0c;安装包可从参考资料[1]获取 下载后解压zip文件&#xff0c;将jar放在lib目录下 编辑配置文件 编辑conf文件夹下的prototypeDs.datasource.json 更改数据库相关信息 启动 windows环境下启动Mycat 以管理员身份运行…

Linux重点yum源配置

1.配置在线源 2.配置本地源 3.安装软件包 4.测试yum源配置 5.卸载软件包

Git 完整教程:版本管理、分支操作与远程仓库解析

文章目录 一、引言二、Git原理三、.git目录四、版本回退以及撤销修改五、Git远程控制1、创建仓库2、克隆/下载远程仓库到本地的方法3、本地仓库的修改推送到远程仓库4、拉取远程仓库的修改到本地仓库5、操作标签 六、Git分支1、分支操作&#xff08;创建、删除、合并&#xff0…

九种排序,一次满足

我们在算法题进行练习提升时&#xff0c;经常会看到题目要求数据从大到小输出&#xff0c;从小到大输出&#xff0c;前一半从小到大输出&#xff0c;后一半从大到小输出等&#xff0c;那么这时候就需要用到排序算法&#xff0c;通过排序算法将数据按照一定的顺序进行排序。本文…

排序02 Multi-gate Mixture-of-Experts (MMoE)

MMoE: 不一定适合业务场景 输入向量&#xff08;包含四种特征&#xff09;到三个神经网络&#xff08;专家&#xff09;&#xff0c;不共享参数。实践中超参数专家神经网络个数需要调&#xff0c;会尝试4个或者8个专家。 左边另一个神经网络softmax输出的向量&#xff0c;三个…

element-plus 官方表格排序问题

element-plus 官方API 默认表格排序存在问题&#xff0c;一个list 被多组排序 修改后&#xff1a; 注意点&#xff1a; 这里一定要使用 sortable"custom"&#xff0c;自定义 sort-change 方法 使用 sortable true 的情况排序会冲突&#xff0c;出现莫名奇妙的问题…

Oracle SQL练习题,从小白到入门 - 上

从事DBA以来&#xff0c;越来越认识到自己SQL水平不足&#xff0c;想想sql语句还停留在大二寒假学习的黑马的Mysql《Mysql 十天精通》基础篇进阶篇&#xff0c;将近100集一天就学完了&#xff0c;黑马yyds。 再后来&#xff0c;做项目用Spring的MyBatis是真的香&#xff0c;练…

string类的学习(上)

string类与我们再C语言中接触到的字符串数据相似&#xff0c;但是做出了一些重大的提升&#xff0c;封装为类&#xff0c;实现了总多的接口&#xff0c;丰富了其功能&#xff0c;为简化了字符串的使用&#xff0c;那现在我们就开始深入学习string类吧。 1.什么事string类 C语言…

Java项目:155 springboot酒店管理系统(含论文+ppt+开题报告+说明文档)

作者主页&#xff1a;源码空间codegym 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 项目介绍 ​ 后台&#xff1a; 1.登录&#xff1a;输入账号、密码&#xff0c;即可登录。 2.套房管理&#xff1a;可对房间房型进行管理。 3.入住管…

elk部署安装

elk部署 前提准备1、elasticsearch2、kibana3、logstash 前提准备 1、提前装好docker docker-compose相关命令 2、替换docker仓库地址国内镜像源 cd /etc/docker vi daemon.json # 替换内容 {"registry-mirrors": [ "https://docker.1panel.dev", "ht…

L1练习-鸢尾花数据集处理(分类/聚类)

背景 前文&#xff08;《AI 自学 Lesson1 - Sklearn&#xff08;开源Python机器学习包&#xff09;》&#xff09;以鸢尾花数据集的处理为例&#xff0c;本文将完善其代码&#xff0c;在使用 sklearn 的部分工具包基础上&#xff0c;增加部分数据预处理、数据分析和数据可视化…