一:迭代器基本概念:第十三章第九节
迭代器:是一个“可遍历STL容器全部或者部分元素”的对象(行为类似于指针的对象);
迭代器用来表现容器中的某一位置;迭代器紧密依赖于容器,迭代器是由容器提供的。也就是说,一般情况是容器里定义着迭代器的具体类型细节;
理解成:迭代器和容器紧密相关(绑定)
#include <vector>
#include <iostream>
using namespace std;
void func()
{
vector<int> vi = { 100, 200, 300 }; //定义一个容器
for (vector<int>::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 <set>
#include <map>
#include <list>
#include <array>
#include <vector>
#include <iostream>
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 <typename T>
void display_category(T iter)
{
//T的类型编译器能推导出来
cout << "--------------begin---------------" << endl;
//整个这个类型 iterator_traits<T>::iterator_category 叫过滤器(萃取机),用来获取T迭代器类型的种类
typename iterator_traits<T>::iterator_category cagy; //相当于获取迭代器种类
_display_category(cagy); //编译器会挑选一个最合适的参数的重载_display_category
std::cout << "typeid(iter).name() = " << typeid(iter).name() << std::endl;
std::cout << "---------------end----------------" << std::endl;
}
void func()
{
//这种类型():代表会产生一个临时对象,比如类A()代表产生一个临时A类对象
display_category(array<int, 100>::iterator());
display_category(vector<int>::iterator());
display_category(list<int>::iterator());
display_category(map<int, int>::iterator());
display_category(set<int>::iterator());
}
int main()
{
cout << "begin" << endl;
func();
cout << "end" << endl;
return 0;
}