Iterator_traits到底有什么用?

最近在看《STL源码剖析》,到了讲iterator_traits的这一节(3.4)。实现它的代码倒是看得懂,但是对它的使用场景却是有点摸不着头脑。

让我先贴一段代码,然后我们再慢慢看。

注意:编译时要把编译器对C++11的支持打开(-std=c++11)

#include <iostream>
#include <vector>

using namespace std;

//第一种方式
template <class Iter>
struct iter_traits//简化版的iterator_traits,只定义了value_type;为了区别于STL中的iterator::traits,名字也改为iter_traits
{
    typedef typename Iter::value_type value_type;
};

//第二种方式,偏特化
template <class Type>
struct iter_traits<Type *>
{
    typedef Type value_type;
};

template <class Iter>
void iter_print(const Iter &a, const Iter &b)
{
    typedef typename iter_traits<Iter>::value_type T; //此处是关键,请思考一下:如果a,b是指针的话,除了用iter_traits的第二种方式,还有什么办法可以获得a或b所指向的数据的类型?
    T key;
    Iter p;
    for(p=a;p!=b;p++)
    {
        key = *p;
        cout << key << ",";
    }
    cout <<endl;
}

int main()
{
    int a[10] = {1,2,3,4,5,6,7,8,9,10};
    vector<string> b{"A","B","C","D","E","F","G"};

    iter_print<int *>(a,a+10);
    iter_print<vector<string>::iterator>(b.begin(), b.end());
    return 0;
}

代码要干的活很简单,就是在main里调用iter_print函数来打印一个数组和一个vector<string>的内容。

iter_print是一个模板函数,有两个参数,其类型都是Iter,分别表示区间的开始和结束。(实际上在STL中,类似iter_print的函数有很多,比如sort,copy等等,它们都是模板函数,并且以iterator为参数)。

在iter_print中有一个需求,就是通过Iter来获取它所代表的容器中数据的类型,从而可以定义一个变量key(在这个函数中,key不是必须的,只是以它为例子,说明有这么一个需要):

    T key;

一般的Iterator类中都会定义一个value_type类型(比如vector<string>::iterator这个类中会定义一个value_type,其类型是string),因此,在iter_traits的第一种定义方式中只要通过

typedef typename Iter::value_type value_type;

就可以得到其类型。

但是,iter_print函数的参数还有可能是指针(请回想一下,STL中的sort函数就可以接受两个指针作为参数)。这样一来,第一种定义方式对指针来说就失效了(因为原生指针不是一种类型)。这时,为了能从指针中取得所指向的数据的类型,就要通过第二种定义方式(偏特化)。

通过这两种方法,不论对于iterator也好,还是指针也好,iterator_traits都可以取得其数据类型(其实很大程度上就是为了获取指针所指向的数据的类型,因为对于iterator来说,本来就已经定义了value_type)。

时间: 2024-08-01 20:06:29

Iterator_traits到底有什么用?的相关文章

From Concept to Iterator_traits

template <class Iterator, class T> Iterator find(Iterator first, Iterator last, const T& value) { while(first!=last&& *first!=value) ++first; return first; } 上面是 C++ 中一个普通的模板函数,调用的时候直接将特定类型变量当参数传入就行,这段程序运用了 Generic Programming(泛型编程/GP).

前端里移动端到底比pc端多哪些知识?

前端里移动端到底比pc端多哪些知识,为啥面试时好多公司都问h5水平如何? 我做过几年的web前端开发,就简单谈谈自己的感受吧. 首先来看看PC端和移动端在前端开发上的一些区别: (1)PC考虑的是浏览器兼容性,移动端开发考虑的更多的是手机兼容性,因为目前不管是android手机还是ios手机,一般浏览器用的都是webkit内核,所以做移动端开发,更多考虑的应该是手机分辨率的适配,和不同操作系统的略微差异化: (2)在部分事件的处理上,移动端自然是偏向于触屏的,所以触屏事件的一些规律要多摸索一下,

自动化测试到底是什么

引子 偶然在群里有人问自动化测试到底是啥,搞不懂.qtp对象库好麻烦,jmeter怎么做测试....一堆一堆的问题.其实说实话真心不知道该咋解答了,我的内心是累的~ 突然想到自己的新书里不就解释过这些吗!看来还是很多童鞋对于自动化测试的认知存在巨大的问题啊! so,以下内容选择<小强软件测试疯狂讲义> 重新认识性能测试之后我们再来看看自动化测试到底是什么.其实这个话题我在不同的场合多次谈过,甚至在我创办的"挨踢脱口秀"中也专门做了一次节目来说明,但可惜的是仍然有很多朋友对自

听说很多公司安装了电脑监控软件,到底是为了什么?

听说很多公司安装了电脑监控软件,到底是为了什么?企业安装公司电脑监控软件并不是为了监控员工上班在跟谁qq聊天.聊些什么内容.在看什么网页--.而是借用公司电脑监控软件为管理工具,通过软件规范和管理员工,提高工作效率. 1.指导和培训员工 比如通过安装公司电脑监控软件,利用实时画面监控,在管理端实时查看员工工作过程,以此了解该员工具体工作是否存在不足,对其进行有针对性的指导和培训 2.提升销售员沟通能力 比如在电脑监控软件管理端,可以看到被控端员工电脑与客户聊天过程和聊天记录,管理者可以找出其中沟

到底是 Activity 被回收了还是进程被杀死了?

不管是安卓的官方文档还是源码注释,处处可见"从 Activity A 跳到 Activity B,当系统内存不足时 A 可能会被回收--",而且没有明确说明 A 和 B 是否属于同一个 app 或进程. 但是,在官方给的 Activity 生命周期图中,却说内存不足时低优先级的进程将被杀死. 那么,内存不足时,到底是 Activity 被回收了呢,还是进程被杀死了呢,还是二者都出现了呢? 答案是,Activity 被回收了,而且进程被杀死了,而且该进程是后台进程. 默认情况下,一个 a

malloc和free的内存到底有多大?——GNU glib库

大家应该都比较熟悉这一点:malloc分配的内存一定大于用户指定的大小!而且很多人也问过这样的问题:到底大多少?以及实际上malloc到底分配了多少? 我们知道这个大小一定在某个"神奇"地方记录着,但是就像自己的"思维"一样,你确无法感知!不过,这是错觉,只是我们习惯了只使用,而没有深入剖析源码,在这里我将揭开这个面纱,去掉其透明化! 声明:源码基于GNU glib库的2.7版本的malloc目录下相关文件 再声明:不同的C库实现方式不一定一样,这里是glib库,如

最大的幻术-游戏开发-到底是先学游戏引擎还是先学游戏编程

学习游戏的目的 我们学习游戏制作,游戏开发,游戏编程,游戏XX,我们的目的只有一个,打造一个非常牛逼,非常屌,非常让人开心的虚拟体验.我们用自己的学识让玩家在虚拟世界征战,生活,一步一步的让玩家幸福!那么我们的目的只有一个,让玩家知道自己的幸福在哪里,并且学会追求自己的幸福.当然,每个人对幸福的定义不一样.那么,我们只好让玩家来体验我们所来表达的最通俗的,最普遍的幸福体验,然后慢慢引导玩家去寻找自己的幸福体验.可能,在最后玩家都会离开游戏,离开虚拟世界,(对,这是真的,玩家需要一步一步达到定点,

null?对象?异常?到底应该如何返回错误信息

这篇文章记录我的一些思考.在工作了一段时间之后. 问题的核心很简单:到底如何返回错误信息. 学生时代,见到过当时的老师的代码: 1 if (foo() == null) { 2 3 } 当然,这位老师是一位比较擅长c/c++的老程序员,所以他的代码其实使用c写的.但是意思和这段代码类似.当时,我很好奇为什么要对一个方法的返回值是不是null进行判断.现在当然很清楚了:在很多win32的API里面,是通过返回值为null来传递"函数调用失败"这一种信息的. 那么,这么做好吗? 我翻看了很

涉嫌垄断的App Store,到底做了什么让开发者暴怒

什么行业最赚钱?不是你想象中的餐饮.互联网.钻石,而是垄!断!行!业!不管是垄断什么,只要一家独大,就能任意制定价格和游戏规则,将利益最大化.还有掌控整个链条上参与者的"生杀大权",不亦快哉!但一旦玩过火,也会激起激烈的反抗.而近日,苹果App Store就成为了众矢之的. 限于苹果App Store近段时间以来的"疯狂压迫",不堪忍受的开发者们暴怒了!国内相关开发者和律师专家团队召开苹果应用市场反垄断集体行动说明会,认为后者在长期运营中涉嫌违法.侵权并存在垄断行为