STL迭代器

Posted randyniu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STL迭代器相关的知识,希望对你有一定的参考价值。

迭代器所指对象的型别,就是value_type

模版参数推导可以获得,但是如果value_type作为函数返回值类型,那就不可以了,因为模版只能推导参数,不能推导函数返回值。

因此 通过typedef是另外一种方式,将该类型先给缓存起来,然后在进行使用,这是一种实现方式。

但是这种方式对于原生指针是失效的,上面这种方式是将类型放置在了类中,而指针并不是一种类,因此,对于指针类型需要特殊进行处理,这就用到了偏特化了。

偏特化的意思是,是模版的一部分,是在模版这个大前提之下进行的,也就是可以设计出一个仅仅针对于指针的偏特化版本出来。

现在我们就可以针对迭代器的参数为指针做特殊的设计了。

template<class  T>
struct iterator_traits<T*>
{
typedef T value_type
}
// 这样就通过偏特化的方式可以通过iterator_traits获取所有迭代器类型的value_type了,只要对应类类型定义了,对应的指针偏特化类型定义了,编译器就都可以找的到。

两个迭代器之间的距离,用difference_type来进行表示。

从迭代器所指的内容是否被修改的角度来讲,迭代器分为不允许修改的对象指向的内容,可以修改对象指向的内容

reference_type指的就是可以修改指向的内容的一种。对应有一种是const_reference_type类型。

迭代器所指之物和迭代器所指向的内容是两个不同的概念,前者是值pointer_type 而后者指的是reference_type。

对应的也有const_pointer_type类型。

迭代器器的分类,有5类,分别是

input

output

forward

bidirectional

random access

这个是通过函数重载的方式在编译阶段确定到底是调用那个函数,这就需要借助于 traits的手段了,可以访问到对应类型的迭代器的具体类型。注意要对原生指针进行偏特化,原生指针是属于随即访问迭代器类型的。

内嵌型别在加上编译器的模版推导机制,增强了C++未提供关于型别认证方面的能力,弥补了C++不为强类型语言的缺陷。同时这种方式是进行元编程的一种实现方式,就不单纯的写逻辑了,而是在数据类型上面进行操作,没有运行前都都知道具体的类型是什么了。简直厉害的不得了。

迭代器的部分大概就是这些了,其实迭代器是挺好理解了,但是真正的写出来确实需要真本事,因为有很多细节是需要进行考虑的,感觉C++提供的偏特化。

 






以上是关于STL迭代器的主要内容,如果未能解决你的问题,请参考以下文章

我正在尝试使用 c++ STL 制作 prims 算法。在迭代器第一次迭代后,它会停止代码并给出错误的输出

c++ STL 迭代器失效问题

C++ STL 基础及应用 迭代器

STL源码剖析(迭代器)

STL 笔记 迭代器 iterator

C++ STL map迭代器