110 C++ STL 迭代器的概念和分类

一。迭代器基本概念

迭代器是一个 “可以遍历STL容器全部或者部分元素”的对象。

这个对象类似于指针的作用。

迭代器用来表现容器中的某一个位置。

迭代器紧密依赖于容器,迭代器是由容器来提供的,也就是说:一般来说,是容器里面定义这迭代器的具体类型细节。

可以劣迹为迭代器和容器紧密相关。

*iter :可以将迭代器所指向容器中的元素内容。

不同的容器所使用的迭代器是不同的。

例子:

二。迭代器的分类

分类的依据:迭代器的移动特性以及在这个迭代器上能够做的操作

例如list 是可以前后移动的,forward_list就只能往一边移动。

vector是可以通过 iter+3,这样的操作,但是 list就不能,

这些迭代器实际上是有继承关系的。

都是struct

并不是所有的容器都有迭代器,例如stack 和 queue

这个也是可以想象的,stack的栈,先进后出,因此只能从栈顶取得元素,要迭代器有啥用?

queue 是队列,先进先出,只能从给队尾插入元素,从对头出,要迭代器有啥用?

可以通过代码正在运行的容器用的是啥类型的迭代器

参考这哥们的代码

【C++】查看各种容器使用的迭代器是什么类型的_c++查看迭代器类型-CSDN博客

#include <iostream>
#include <cstdlib>
#include <string>
#include <vector>
#include <memory>
#include <set>
#include <map>
#include <list>
#include <array>
#include <unordered_map>
#include <unordered_set>
#include <deque>
#include <forward_list>
 
using namespace std;
//如下这段define 是让在cmd上运行的东西 显示特效,可以忽略
#define NONE "\033[m"
#define RED "\033[0;32;31m"
#define LIGHT_RED "\033[1;31m"
#define GREEN "\033[0;32;32m"
#define LIGHT_GREEN "\033[1;32m"
#define BLUE "\033[0;32;34m"
#define LIGHT_BLUE "\033[1;34m"
#define DARY_GRAY "\033[1;30m"
#define CYAN "\033[0;36m"
#define LIGHT_CYAN "\033[1;36m"
#define PURPLE "\033[0;35m"
#define LIGHT_PURPLE "\033[1;35m"
#define BROWN "\033[0;33m"
#define YELLOW "\033[1;33m"
#define LIGHT_GRAY "\033[0;37m"
#define WHITE "\033[1;37m"
#define SHINE "\033[5m"      //闪烁
#define DASH "\033[9m"       // 中间一道横线
#define QUICKSHINE "\033[6m" //快闪
#define FANXIAN "\033[7m"    //反显
#define XIAOYIN "\033[8m"    // 消隐,消失隐藏
 
// 验证迭代器所属种类
void _display_category(random_access_iterator_tag mytag)
{
    cout << "random_access_iterator_tag" << endl;
}
 
void _display_category(bidirectional_iterator_tag mytag)
{
    cout << "bidirectional_iterator_tag" << endl;
}
 
void _display_category(forward_iterator_tag mytag)
{
    cout << "forward_iterator_tag" << endl;
}
 
void _display_category(output_iterator_tag mytag)
{
    cout << "output_iterator_tag" << endl;
}
 
void _display_category(input_iterator_tag mytag)
{
    cout << "input_iterator_tag" << endl;
}
 
template <typename T>
void display_category(string &str, T ite)
{

//这里使用的是 萃取机,萃取机可以获取迭代器的种类。
    typename iterator_traits<T>::iterator_category cagy; // 用萃取机获取T迭代器类型的种类
    cout << RED << str << " : " << NONE; //这就是cdm上使用特效的代码
    _display_category(cagy); //编译器挑选一个最适合的参数的重载_display_category
    cout << RED << str << " : " << NONE << "typeid(ite).name() = " << typeid(ite).name() << endl;
    //cout << "\033[1;35m---------------end-------------------\033[m" << endl;
    cout
        << XIAOYIN << YELLOW << "----------------------------------------end-----------------------------------------------" << NONE << endl
        << endl
        << endl;
};
 
int main(void)
{
    string arrayName = "array";
    string vectorName = "vector";
    string listName = "list";
    string forward_listName = "forward_list";
    string dequeName = "deque";
 
    string setName = "set";
    string mapName = "map";
    string multimapName = "multimap";
    string multisetName = "multiset";
 
    string unordered_setName = "unordered_set";
    string unordered_mapName = "unordered_map";
 
    string unordered_multisetName = "unordered_multiset";
    string unordered_multimapName = "unordered_multimap";
 
//array<int, 100>::iterator 是一种类型,后面加上(),代表的是为这中类型产生一个临时对象
    display_category(arrayName, array<int, 100>::iterator()); //这种类型():代表产生 一个临时对象
    display_category(vectorName, vector<int>::iterator());
    display_category(listName, list<int>::iterator());
    display_category(forward_listName, forward_list<int>::iterator());
    display_category(dequeName, deque<int>::iterator());
 
    display_category(setName, set<int>::iterator());
    display_category(mapName, map<int, int>::iterator());
 
    display_category(multimapName, multimap<int, int>::iterator());
    display_category(multisetName, multiset<int>::iterator());
 
    display_category(unordered_setName, unordered_set<int>::iterator());
    display_category(unordered_mapName, unordered_map<int, int>::iterator());
 
    display_category(unordered_multisetName, unordered_multiset<int>::iterator());
    display_category(unordered_multimapName, unordered_multimap<int, int>::iterator());
    return 0;
}

如下两张图来源于C++STL之迭代器(iterator)详解_c++迭代器-CSDN博客

三,各个种类的迭代器的能力。这里可以不研究,知道就行,后续用到的时候,可以对照这个

没有继承的这个先弄一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值