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迭代器的主要内容,如果未能解决你的问题,请参考以下文章