19.5 迭代器的概念和分类
创始人
2024-03-25 08:45:10

一:迭代器基本概念:第十三章第九节

迭代器:是一个“可遍历STL容器全部或者部分元素”的对象(行为类似于指针的对象);

迭代器用来表现容器中的某一位置;迭代器紧密依赖于容器,迭代器是由容器提供的。也就是说,一般情况是容器里定义着迭代器的具体类型细节;

理解成:迭代器和容器紧密相关(绑定)

#include 
#include using namespace std;void func()
{vector vi = { 100, 200, 300 };  //定义一个容器for (vector::iterator iter = vi.begin(); iter != vi.end(); iter++){cout << *iter << endl;  //iter:指向容器中元素,*iter:打印迭代器所指向容器中的元素内容}return;
}int main()
{func();cout << "end" << endl;return 0;
}

二:迭代器的分类

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

迭代器,行为如指针,到处跳,表示一个位置,我们一般分类是依据其跳跃能力,每个分类是一个对应的struct定义。

<1>输出型迭代器:(Output iterator)
struct output_iterator_tag
一步一步能往前走。并且能够通过这个种类的迭代器来改写容器中的数据。

<2>输入型迭代器:(Input iterator)
struct input_iterator_tag
一次一个以向前的方向来读取元素,按照这个顺序一个一个返回元素值。

<3>前向迭代器:(Forward iterator)
struct forward_iterator_tag
因为继承自Input迭代器,因此它能以向前的方向来读取元素,并且读取时提供额外保证。

<4>双向迭代器:(Bidireactional iterator)
struct bidirectional_iterator_tag
在前向迭代器基础之上增加了反向迭代,也就是迭代位置可以回退。

<5>随机访问迭代器:(Random-access iterator)
struct random_access_iterator_tag
在双向迭代器基础上又增加了所谓的随机访问能力,也就是增减某个偏移量,能够计算距离。还支持一些关系运算等等。

这些分类(结构)都有继承关系的,大多数容器里都有一个::iterator迭代器类型;并不是所有容器里都有迭代器;比如stack、queue等容器就不提供迭代器。

#include 
#include 
#include 
#include 
#include 
#include using namespace std;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(input_iterator_tag mytag)
{cout << "input_iterator_tag" << endl;
}void _display_category(output_iterator_tag mytag)
{cout << "output_iterator_tag" << endl;
}template 
void display_category(T iter)
{//T的类型编译器能推导出来cout << "--------------begin---------------" << endl;//整个这个类型 iterator_traits::iterator_category 叫过滤器(萃取机),用来获取T迭代器类型的种类typename iterator_traits::iterator_category cagy;  //相当于获取迭代器种类_display_category(cagy);  //编译器会挑选一个最合适的参数的重载_display_categorystd::cout << "typeid(iter).name() = " << typeid(iter).name() << std::endl;std::cout << "---------------end----------------" << std::endl;
}void func()
{//这种类型():代表会产生一个临时对象,比如类A()代表产生一个临时A类对象display_category(array::iterator());display_category(vector::iterator());display_category(list::iterator());display_category(map::iterator());display_category(set::iterator());
}int main()
{cout << "begin" << endl;func();cout << "end" << endl;return 0;
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...