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

🚀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为例,看看如何使用迭代器遍历其中的元素:

cpp 复制代码
#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++学习

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

相关推荐
一个闪现必杀技几秒前
Python入门--函数
开发语言·python·青少年编程·pycharm
Fan_web4 分钟前
jQuery——事件委托
开发语言·前端·javascript·css·jquery
龙图:会赢的7 分钟前
[C语言]--编译和链接
c语言·开发语言
sp_fyf_202413 分钟前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
bug菌¹25 分钟前
滚雪球学Oracle[4.2讲]:PL/SQL基础语法
数据库·oracle
rjszcb26 分钟前
一文说完c++全部基础知识,IO流(二)
c++
逸巽散人35 分钟前
SQL基础教程
数据库·sql·oracle
月空MoonSky1 小时前
Oracle中TRUNC()函数详解
数据库·sql·oracle
momo小菜pa1 小时前
【MySQL 06】表的增删查改
数据库·mysql
小字节,大梦想1 小时前
【C++】二叉搜索树
数据结构·c++