码迷,mamicode.com
首页 > 其他好文 > 详细

STL迭代器

时间:2018-06-27 18:57:48      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:内容   定义   因此   返回   c++   bsp   its   就是   参数   

迭代器所指对象的型别,就是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++   bsp   its   就是   参数   

原文地址:https://www.cnblogs.com/randyniu/p/9235340.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!