迭代器解释(C++)

一、什么是迭代器

为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector、list、map、set等。然而有些容器(vector)可以通过下标索引的方式访问容器里面的数据,但是大部分的容器(list、map、set)不能使用这种方式访问容器中的元素。为了统一访问不同容器时的访问方式,STL为每种容器在实现的时候设计了一个内嵌的iterator类,不同的容器有自己专属的迭代器(专属迭代器负责实现对应容器访问元素的具体细节),使用迭代器来访问容器中的数据。除此之外,通过迭代器可以将容器和通用算法结合在一起,只要给予算法不同的迭代器,就可以对不同容器执行相同的操作,例如find查找函数(因为迭代器提供了统一的访问方式,这是使用迭代器带来的好处)。迭代器对一些基本操作如*、->、++、==、!=、=进行了重载,使其具有了遍历复杂数据结构的能力,其遍历机制取决于所遍历的容器,所有迭代器的使用和指针的使用非常相似。通过begin,end函数获取容器的头部和尾部迭代器,end迭代器不包含在容器之内,当begin和end返回的迭代器相同时表示容器为空。

STL主要由 容器、迭代器、算法、函数对象、和内存分配器 五大部分构成。

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;//初始化容器for (int i = 0; i < 10; ++i){v.push_back(i);}//利用迭代器遍历容器for (vector<int>::iterator it = v.begin(); it != v.end(); ++it){cout << *it << " ";}
}

二、迭代器类型

按照迭代器的功能强弱,可以把迭代器分为以下几种类型:

1、输入迭代器

功能:

  • 通用的四种功能
  • 只能利用迭代器进行输入功能
  • 它只能用于单遍扫描算法

2、输出迭代器

功能:

  • 通用的四种功能
  • 只能利用迭代器进行输入功能
  • 只能用于单遍扫描算法

3、前向迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 能用于多遍扫描算法

4、双向迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 能用于多遍扫描算法
  • 前置和后置递减运算(- -),这意味这它能够双向访问

随机访问迭代器

功能:

  • 通用的四种功能
  • 能利用迭代器进行输入和输出功能
  • 前置和后置递减运算(- -)(意味着它是双向移动的)
  • 比较两个迭代器相对位置的关系运算符(<、<=、>、>=)
  • 支持和一个整数值的加减运算(+、+=、-、-=)
  • 两个迭代器上的减法运算符(-),得到两个迭代器的距离
  • 支持下标运算符(iter[n]),访问距离起始迭代器n个距离的迭代器指向的元素
  • 能用于多遍扫描算法。 在支持双向移动的基础上,支持前后位置的比较、随机存取、直接移动n个距离

三、常用容器的迭代器

vector ——随机访问迭代器

deque——随机访问迭代器

list —— 双向迭代器

set / multiset——双向迭代器

map / multimap——双向迭代器

stack——不支持迭代器

queue——不支持迭代器

四、实例

双向迭代器随机访问迭代器是最为常用的,因此下面演示这两种迭代器的用法

双向迭代器

#include <iostream>
#include <list>
using namespace std;int main()
{list<int> lst;for (int i = 0; i < 10; ++i){lst.push_back(i);}list<int>::iterator it;//创建list的迭代器cout << "遍历lst并打印: ";for (it = lst.begin(); it != lst.end(); ++it)//用 != 比较两个迭代器{cout << *it << " ";}//此时it=lst.end(),这个位置是最后一个元素的下一个位置,没有存储数据--it;//等价于it--,回到上一个位置//it -= 1; //报错,虽然都是-1,但这种方式是随机迭代器才有的功能cout << "\nlst的最后一个元素为:" << *it << endl;
}

随机访问迭代器

#include <iostream>
#include <vector>
using namespace std;int main()
{vector<int> v;for (int i = 0; i < 10; ++i){v.push_back(i);}vector<int>::iterator it;for (it = v.begin(); it != v.end(); ++it) //用 != 比较两个迭代器{cout << *it << " ";}cout << endl;for (it = v.begin(); it < v.end(); ++it) //用 < 比较两个迭代器{cout << *it << " ";}cout << endl;it = v.begin();//让迭代器重新指向首个元素的位置while (it < v.end())//间隔一个输出{cout << *it << " ";it += 2; // 用 += 移动迭代器}cout << endl;it = v.begin();cout << it[5] << endl; //用[]访问
}

对于vector容器来说,其迭代器有失效的可能。
vector容器有动态扩容的功能,每当容器容量不足时,vector就会进行动态扩容,动态扩容不是在原来的空间后面追加空间,而是在寻找一段新的更大的空间,把原来的元素复制过去。
但是这样一来,容器存储元素的位置就改变了,原来的迭代器还是指向原来的位置,因此每次进行动态扩容后原来的迭代器就会失效。

这里可以查看之前发过的vector和list的区别。

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

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

相关文章

php基础知识快速入门

一、PHP基本知识 1、php介绍&#xff1a; php是一种创建动态交互性的强有力的服务器脚本语言&#xff0c;PHP是开源免费的&#xff0c;并且使用广泛。PHP是解释性语言&#xff0c;按顺序从上往下执行&#xff0c;无需编译&#xff0c;直接运行。PHP脚本在服务器上运行。 2、ph…

【STM32嵌入式系统设计与开发】——18StaticNixite(静态数码管应用)

这里写目录标题 STM32资料包&#xff1a; 百度网盘下载链接&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1mWx9Asaipk-2z9HY17wYXQ?pwd8888 提取码&#xff1a;88881、函数编辑&#xff08;1&#xff09;主函数编辑&#xff08;2&#xff09;主函数头文件函数&#x…

Vue 介绍

【1】前端发展史 前端的发展史可简述为&#xff1a; 从最初的静态页面编写&#xff0c;依赖后端模板渲染逐步演化为通过JavaScript&#xff08;特别是Ajax技术&#xff09;实现前后端分离&#xff0c;使得前端能够独立地加载数据和渲染页面随后&#xff0c;Angular、React、Vu…

CTF(Web)中关于执行读取文件命令的相关知识与绕过技巧

在我遇到的题目中&#xff0c;想要读取文件必然是要执行cat /flag这个命令&#xff0c;但是题目当然不会这么轻松。让你直接cat出来&#xff0c;必然会有各种各样的滤过条件&#xff0c;你要做的就是尝试各种方法在cat /flag的基础上进行各种操作构建出最终的payload。 下面我…

Vite构造Vue3

环境安装 node.js安装-CSDN博客 初始化Vue项目安装脚手架_vue init webpack安装脚手架-CSDN博客 选择Vue框架 &#xff0c;项目名称可以自定义&#xff0c;我使用默认的 vite-project 选择JS 进入项目安装依赖 安装路由

Leetcode编程练习

面试题-消失的数字 . - 力扣&#xff08;LeetCode&#xff09; class Solution { public:void reverse(vector<int>& nums, int start, int end) {while (start < end) {swap(nums[start], nums[end]);start 1;end - 1;}}void rotate(vector<int>& …

AI预测体彩排3第3套算法实战化赚米验证第2弹2024年5月6日第2次测试

由于今天白天事情比较多&#xff0c;回来比较晚了&#xff0c;趁着还未开奖&#xff0c;赶紧把预测结果发出来吧~今天是第2次测试~ 2024年5月6日排列3预测结果 6-7码定位方案如下&#xff1a; 百位&#xff1a;2、3、1、5、0、6 十位&#xff1a;4、3、6、8、0、9 个位&#xf…

自动驾驶主流芯片及平台架构(二)特斯拉自动驾驶芯片平台介绍

早期 对外采购mobileye EyeQ3 芯片摄像头半集成方案&#xff0c;主要是为了满足快速量产需求&#xff0c;且受制于研发资金不足限制&#xff1b; 中期 采用高算力NVIDIA 芯片平台其他摄像头供应商的特斯拉内部集成方案&#xff0c;mobileye开发节奏无法紧跟特斯拉需求&#xff…

嵌入式学习

笔记 作业 有如下结构体 struct Student{ char name[16]; int age; double math_score; double chinese_score; double english_score; double physics_score; double chemistry…

Vue 基础语法

【1】模板语法 &#xff08;1&#xff09;差值表达式 {{}}是 Vue.js 中的文本插值表达式。 它用于在模板中输出数据或表达式的值。当数据或表达式的值发生变化时&#xff0c;插值表达式会自动更新。 补充&#xff1a;三目运算符 它的基本语法是 Condition ? A : B&#xff0…

设计模式Java实现-工厂模式

✨这里是第七人格的博客✨小七&#xff0c;欢迎您的到来~✨ &#x1f345;系列专栏&#xff1a;设计模式&#x1f345; ✈️本篇内容: 工厂模式✈️ &#x1f371;本篇收录完整代码地址&#xff1a;https://gitee.com/diqirenge/design-pattern &#x1f371; 楔子 记得刚…

Junit 测试中如何对异常进行断言

本文对在 Junit 测试中如何对异常进行断言的几种方法进行说明。 使用 Junit 5 如果你使用 Junit 5 的话,你可以直接使用 assertThrows 方法来对异常进行断言。 代码如下: Exception exception = assertThrows(NumberFormatException.class, () -> {new Integer("on…