STL中的神秘“指针”:迭代器

本文介绍了C++中的迭代器概念,包括其作为抽象数据类型的功能,以及五种不同类型的迭代器:输入迭代器、输出迭代器、前向迭代器、双向迭代器和随机访问迭代器。文章强调了迭代器在STL中的重要性,通过举例展示了如何使用迭代器遍历容器如vector,并提到了自定义迭代器的可能性。
摘要由CSDN通过智能技术生成

在这里插入图片描述

🚀write in front🚀
📜所属专栏:C++学习
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我你们将会看到更多的优质内容!!

在这里插入图片描述

前言

  今天我们将一起深入探讨C++中的一个重要概念——迭代器(Iterators)。在C++标准库中,迭代器是一种用于遍历容器元素的工具,它为我们提供了一种统一的访问容器内元素的方式,不论容器的类型如何。在本篇博客中,我们将从头开始学习迭代器的原理、分类以及它在STL中的实际应用。

什么是迭代器?

  迭代器是一种抽象的数据类型,类似于指针。它允许我们遍历并访问容器(如向量、列表、映射等)中的元素,而无需了解容器内部的结构细节。迭代器的行为类似于指针,允许我们使用类似指针的语法(如解引用、自增等)来操作容器中的元素。

迭代器的分类(容器底层结构决定)

在C++中,迭代器被分为五个类别,每个类别具有不同的功能和限制。这五种迭代器分别为:

  1. 输入迭代器(Input Iterators):
    功能:只能读取容器中的元素,且只能使用一次。类似于只读的指针。
    特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于单向遍历容器元素,例如用于查找、遍历等操作。

  2. 输出迭代器(Output Iterators):
    功能:只能向容器中写入元素,也只能使用一次。类似于只写的指针。
    特点:支持解引用(*)、自增(++)等操作。
    示例:较少使用,用于特殊场景的数据写入。

  3. 前向迭代器(Forward Iterators):
    功能:可以读取和写入容器中的元素,且能够多次遍历容器。
    特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于单向遍历,可以遍历某个容器的所有元素。

  4. 双向迭代器(Bidirectional Iterators):
    功能:功能与前向迭代器类似,但支持自增(++)和自减(–)操作。
    特点:支持解引用(*)、自增(++)、自减(–)、相等性比较(==)和不等性比较(!=)等操作。
    示例:常用于双向遍历,可以在容器中前进和后退。

  5. 随机访问迭代器(Random Access Iterators):
    功能:功能最强大,支持所有迭代器操作,类似于指针的完整功能。
    特点:支持解引用(*)、自增(++)、自减(–)、相等性比较(==)和不等性比较(!=)等操作,还支持算术运算(+、-、+=、-=)、下标访问([])等。
    示例:具有最灵活的遍历能力,可以快速访问容器中的任意元素。

在这里插入图片描述
  我们可以在不同的容器下看到他们的迭代器类型:

list:双向
在这里插入图片描述
vector:随机
在这里插入图片描述
set:双向:
在这里插入图片描述
forward_list:单向:

在这里插入图片描述  在后面继承我们会学到,子类可以通过父类指针指向。上面介绍是是从父类开始介绍的,往下的都是继承上面的。所以我们再看算法库的时候要看清楚哪些能用,哪些不能用,我们以sort为例子:
在这里插入图片描述
  这里的迭代器是随机迭代器,所以我们的vector可以使用,但是list是他的父类,不能指向,所以list不能使用该算法(算法库用的快排,而链表无法快排)

迭代器在STL中的应用

  标准模板库(STL)是C++标准库中一个强大且高度模块化的部分。它提供了许多常用的数据结构和算法,其中的迭代器起到了至关重要的作用,他们是串通算法和容器的神奇指针。
在这里插入图片描述

STL中的容器(如vector、list、map等)都提供了自己的迭代器,让我们可以轻松遍历和操作其中的元素。

让我们以vector为例,看看如何使用迭代器遍历其中的元素:

#include <iostream>
#include <vector>

int main() {
    std::vector<int> myVector = {1, 2, 3, 4, 5};

    // 使用迭代器遍历容器
   vector<int>it1 = lt.begin();
	while (it1 != lt.end())
	{
		cout << *it1 << " ";
		it1++;
	}
	cout << endl;

	auto it2 = lt.begin();
	while(it2!=lt.end())
	{
		cout << *it2 << " ";
		it2++;
	}
	cout << endl;
    return 0;
}

当然,我们在访问list等其他容器的时候也是这样的。

自定义迭代器

  除了使用STL提供的迭代器,我们还可以自定义迭代器,让我们的自定义数据结构也能够像容器一样使用范围-for循环等STL算法。自定义迭代器需要实现一系列的操作符重载,如*、++、–等,以及符合迭代器的五种类别要求。

总结

  迭代器是C++标准库中一种非常重要的抽象概念,它为我们提供了一种统一的访问容器元素的方式,让我们无需了解容器内部的细节。通过使用迭代器,我们能够更加灵活地处理数据结构,从而更加高效地开发C++程序。希望通过本篇博客,读者们能够对C++迭代器有更深入的了解,并能在实际项目中灵活运用它们。

  更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

专栏订阅:
每日一题
C语言学习
算法
智力题
初阶数据结构
Linux学习
C++学习
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!

在这里插入图片描述

  • 16
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

坤小满

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值