具体实现肯定不如书上讲的清楚了,这里只是根据侯捷书上的讲解,自己建立一条思路以及形成一些相关的概念

迭代器也可被称作智能指针,用于遍历容器内的元素,stl每个容器都实现了自己的iterator,iterator可以是一个类对象,也可以是原生指针

因此对迭代器进行解应用操作的时候需要重载* ->运算符,使之能正确返回元素对象,这两个重载是迭代器的核心

另外stl实现了算法和容器的泛型,如何能使算法顺利的对容器进行操作,这又是stl的泛型化必须要解决的问题

这时迭代器又扮演了中介的角色,只需把容器的迭代器传给算法就可以对容器进行操作

新问题又出现了,算法接受迭代器作为参数,这其中又可能用到迭代器所关联的元素型别,比如以关联型别作为返回值

如何获取迭代器关联型别,惯性思维我们可能会这样来做:

iterator::value_type fun();

但是当迭代器是原生指针时,这种用法就不合乎语法了,比如int*,它根本就不是一个类,value_type也就无从谈起了

单独为原生指针弄一套算法是可以,但却背离了泛型思想的初衷,也不可能抛弃原生指针,也就是说iterator本身已经定型,它已经

满足了我们操作容器内部元素的需要,不能在iterator上做文章,因此引入第三方是个不错的办法,也是程序设计中常用的一种思想

关联的双方都没有改进余地的时候,引入第三者总是可以起到四两拨千斤的作用,也就是stl中的traits机制

算法不直接取迭代器的关联型别,而是通过一个traits类来获取,如下

template <class T>

class I_traits

{

typedef typename T::value_type value_type;

};

typename I_traits<iter>::value_type fun();

这样并体现不出traits调停者的作用

为了支持原生指针,除了通用性traits模板,还可以建立该模板的偏特化版本,对模板参数类型作进一步的限制

template <class T>

class I_traits<T *>

{

typedef typename T::value_type value_type;

};

好了不直接使用iterator的valuetype而是通过traits类对iterator进行提取,这样就避免了原生指针不能携带自己的关联型别这种特殊情况,使迭代器的使用方仍然能得到迭代器的关联型别

无论iterator是不是原生指针对traits类型调用valuetype成员都是合法的。

stl迭代器原理的更多相关文章

  1. C++ STL迭代器原理和简单实现

    1. 迭代器简介 为了提高C++编程的效率,STL(Standard Template Library)中提供了许多容器,包括vector.list.map.set等.然而有些容器(vector)可以 ...

  2. STL迭代器iterator

    一:迭代器原理 迭代器是一个“可遍历STL容器内全部或部分元素”的对象. 迭代器指出容器中的一个特定位置. 迭代器就如同一个指针. 迭代器提供对一个容器中的对象的访问方法,并且可以定义了容器中对象的范 ...

  3. STL迭代器笔记

    STL迭代器简介 标准模板库(The Standard Template Library, STL)定义了五种迭代器.下面的图表画出了这几种: input         output \       ...

  4. 一步一步的理解C++STL迭代器

    一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...

  5. STL 迭代器 iterator const

    STL迭代器很多时候可以当成指针来使用. 但是指针一般可以用const来控制访问. 那迭代器呢. #include <iostream> #include <vector> u ...

  6. STL迭代器的使用、正向、逆向输出双向链表中的所有元素

    */ * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:text.cpp * 作者:常轩 * 微信公众号:Worldhe ...

  7. 【STL 源码剖析】浅谈 STL 迭代器与 traits 编程技法

    大家好,我是小贺. 点赞再看,养成习惯 文章每周持续更新,可以微信搜索「herongwei」第一时间阅读和催更,本文 GitHub : https://github.com/rongweihe/Mor ...

  8. stl 迭代器(了解)

    STL 主要是由 containers(容器),iterators(迭代器)和 algorithms(算法)的 templates(模板)构成的. 对应于它们所支持的操作,共有五种 iterators ...

  9. c++ stl nth_element 原理解析

    nth_element是stl中的一个库函数,它会使迭代器nth所指的元素与整个[first,last)完整排序后.同一个位置的元素同值.即找到完整排序时第n位的正确值. 但这个函数与完整排序的区别在 ...

随机推荐

  1. poj1141 区间dp+路径

    //Accepted 176 KB 47 ms //感谢大神们为我们这群渣渣铺平前进的道路!! //用scanf("%s",s)!=EOF WA到死 #include <cs ...

  2. Ubuntu 14.10 下Ganglia监控Hadoop集群

    前提是已经安装好Ganglia和Hadoop集群 1 Master节点配置hadoop-metrics2.properties # syntax: [prefix].[source|sink|jmx] ...

  3. Java(JVM运行时)各种内存区域详解及扩展

    本文整理于  Java内存与垃圾回收调优 Java 堆内存 从几个sample来学习Java堆,方法区,Java栈和本地方法栈 首先来一张图让我们理清楚java运行时状态: 诚然,如上图所示:java ...

  4. 解决:未找到setenv命令

    在Ubuntu12.04中配置python环境变量:setenv PATH "$PATH:/usr/local/bin/python",提示未找到setenv命令. 为什么呢?这是 ...

  5. 产生冠军 map 的 应用 .

    开始 比赛  ,  每一次的 比赛 都会有人失败 , 如果产生英雄的话  , 那就是产生 唯一一个 没有被打败的人  , 就是英雄, . #include<stdio.h> #includ ...

  6. HDOJ-三部曲一(搜索、数学)-1008-Prime Path

    Prime Path Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other) Total S ...

  7. SSO单点登录

    登录持久化机制:Cookies&&Session Cookie:是将信息存储到客户端,所有的信息不安全,都会对信息进行加密,cookies中会存储当前会话的唯一标识,即SessionI ...

  8. HDU1166-敌兵布阵(线段树)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1166 #include<cstdio> #include<string> #i ...

  9. 阅读<构建之法>第13、14、15、16、17章 与 《一个程序员的生命周期》读后感

    第十三章   软件测试 这一章介绍了很多关于测试的方法,比如说单元测试,代码覆盖率测试,构建验证测试,验收测试等,我有一个很纠结的问题,如果我开发软件,是把这么多测试全做完,还是挑一些测试来进行呢?如 ...

  10. 为AM335x移植Linux内核主线代码

    /********************************************************************** * 为AM335x移植Linux内核主线代码 * 说明: ...