🚀write in front🚀
📜所属专栏:C++学习
🛰️博客主页:睿睿的博客主页
🛰️代码仓库:🎉VS2022_C语言仓库
🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!!
关注我,关注我,关注我,你们将会看到更多的优质内容!!
文章目录
- 前言
- 什么是迭代器?
- 迭代器的分类(容器底层结构决定)
- 迭代器在STL中的应用
- 自定义迭代器
- 总结
前言
今天我们将一起深入探讨C++中的一个重要概念——迭代器(Iterators)。在C++标准库中,迭代器是一种用于遍历容器元素的工具,它为我们提供了一种统一的访问容器内元素的方式,不论容器的类型如何。在本篇博客中,我们将从头开始学习迭代器的原理、分类以及它在STL中的实际应用。
什么是迭代器?
迭代器是一种抽象的数据类型,类似于指针。它允许我们遍历并访问容器(如向量、列表、映射等)中的元素,而无需了解容器内部的结构细节。迭代器的行为类似于指针,允许我们使用类似指针的语法(如解引用、自增等)来操作容器中的元素。
迭代器的分类(容器底层结构决定)
在C++中,迭代器被分为五个类别,每个类别具有不同的功能和限制。这五种迭代器分别为:
-
输入迭代器(Input Iterators):
功能:只能读取容器中的元素,且只能使用一次。类似于只读的指针。
特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
示例:常用于单向遍历容器元素,例如用于查找、遍历等操作。 -
输出迭代器(Output Iterators):
功能:只能向容器中写入元素,也只能使用一次。类似于只写的指针。
特点:支持解引用(*)、自增(++)等操作。
示例:较少使用,用于特殊场景的数据写入。 -
前向迭代器(Forward Iterators):
功能:可以读取和写入容器中的元素,且能够多次遍历容器。
特点:支持解引用(*)、自增(++)、相等性比较(==)和不等性比较(!=)等操作。
示例:常用于单向遍历,可以遍历某个容器的所有元素。 -
双向迭代器(Bidirectional Iterators):
功能:功能与前向迭代器类似,但支持自增(++)和自减(–)操作。
特点:支持解引用(*)、自增(++)、自减(–)、相等性比较(==)和不等性比较(!=)等操作。
示例:常用于双向遍历,可以在容器中前进和后退。 -
随机访问迭代器(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++学习
更新不易,辛苦各位小伙伴们动动小手,👍三连走一走💕💕 ~ ~ ~ 你们真的对我很重要!最后,本文仍有许多不足之处,欢迎各位认真读完文章的小伙伴们随时私信交流、批评指正!