STL的中心思想在于:将数据容器和算法分开,彼此独立设计,最后再用一帖粘着剂将它们撮合在一起。没错,这个粘着剂正是迭代器(iterator)。迭代器的主要目的是通过遍历来对容器中元素进行相关操作。算法主要通过迭代器来访问容器,也就是说迭代器是容器和算法之间的桥梁。来段代码如例:

template <class T,  class Allocator = allocator<int> >
Class vector {….};

template <class InputIterator, class T>
InputIterator find(InputIterator first, InputIterator last, const T& value)
{
  While (first != last && *first != value)        ++first;
   return first;
}

  那么可能我们会想假如算法中我们需要用到容器中对象的类型时,我们该如何获得?利用函数模板的参数推导机制吧。那万一对象类型必须用于函数的传回值时,该怎么办?毕竟模板参数推导机制推出的只是参数,而无法推导函数的返回值类型。好吧,Traits编程技巧该上场了。

traits嘛(萃取),就是说如果你有定义一些类型,便把它萃取出来,比如:

template <class T>
struct iterator_traits {
         typedef  typename T:: value_type  value_type;
                      // typename加在T::value_type前告诉编译器这是一个类型
};

template <class I>
typename iterator_traits<I>::value_type   func(I iter)
{
         Return *iter;
}                        

这样便可以将它的类型(返回值类型)萃取出来。

  最常用到的迭代器相应类型有5种,分别为value type(迭代器所指对象的类型),    difference type(两个迭代器之间的距离),   pointer,   reference,   iterator catagoly(迭代器的种类)。如果你希望你开发的容器可以与STL相融合,那么一定要为你的容器的迭代器定义这5种类型,相应代码如下:

template <class I>
struct iterator_traits {
    typedef    typename I::iterator_category       iterator_category;
    typedef    typename I::value_type              value_type;
    typedef    typename I::difference_type         difference_type;
    typedef    typename I::pointer                 pointer;
    typedef    typename I::reference               reference;
};

  当然如果类型并非对象,而是原型指针,那么就更好办了,我们设计了2种traits偏特化版本,如下:

template <class T>
struct iterator_traits<T*> {
         typedef  T  value_type;
};

template <class T>
struct iterator_traits<const T*> {
         typedef  T  value_type;
};

  现在,我们来谈谈iterator_category:

迭代器被分为5类,分别为:

Input Iterator:         这种迭代器所指的对象,不允许被外界改变,只读。

Output Iterator:          只写。

Forword Iterator:         单向迭代器。

Bidirectional Iterator:       双向迭代器。

Random Access Iterator:  可跳转迭代器。(如p+n, p - n)

不同的迭代器类型对算法的效率影响非常大,主要影响于时间复杂度。这里就不讲了,之后单独讲讲。还有对于迭代器适配器也打算放在适配器里讲,这里只是为了大概了解了解迭代器的工作。当然迭代器使用起来是非常方便的,来个例子:

         vector<int> vec;
         vector<int> :: iterator iter;
         for(iter = vec.begin(); iter != vec.end(); iter++) {
            // …
         }    

  C++11的auto用起来也非常方便的。

       vector<int> vec;
        for(auto iter = vec.begin(); iter != vec.end(); iter++) {
             // …
        }    

  

STL之迭代器(iterator)的更多相关文章

  1. STL之迭代器(iterator)

    1 头文件 所有容器有含有其各自的迭代器型别(iterator types),所以当你使用一般的容器迭代器时,并不需要含入专门的头文件.不过有几种特别的迭代器,例如逆向迭代器,被定义于<iter ...

  2. STL 笔记(四) 迭代器 iterator

    stl 中迭代器能够理解为面向对象版本号的广义指针,提供了对容器中的对象的訪问方法,能够遍历容器全部元素.也能够訪问随意元素.stl 迭代器有下面五种: Input iterators   仅仅读,输 ...

  3. STL的迭代器和类型萃取

    今天就可以把STL库中迭代器的实现,和类型萃取好好整理一下了 迭代器的设计思维是STL的关键所在,在STL的实际运用和泛型思维,迭代器都扮演着十分重要的角色,STL力求把数据容器和算法的概念分开来,于 ...

  4. C++迭代器 iterator【转】

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  5. 带你深入理解STL之迭代器和Traits技法

    在开始讲迭代器之前,先列举几个例子,由浅入深的来理解一下为什么要设计迭代器. //对于int类的求和函数 int sum(int *a , int n) { int sum = 0 ; for (in ...

  6. STL中实现 iterator trail 的编程技巧

    STL中实现 iterator trail 的编程技巧 <泛型编程和 STL>笔记及思考. 这篇文章主要记录在 STL 中迭代器设计过程中出现的编程技巧,围绕的 STL 主题为 (迭代器特 ...

  7. C++迭代器 iterator

    1. 迭代器(iterator)是一中检查容器内元素并遍历元素的数据类型.(1) 每种容器类型都定义了自己的迭代器类型,如vector:vector<int>::iterator iter ...

  8. 设计模式C++描述----20.迭代器(Iterator)模式

    一. 举例说明 我们知道,在 STL 里提供 Iterator 来遍历 Vector 或者 List 数据结构. Iterator 模式也正是用来解决对一个聚合对象的遍历问题,将对聚合的遍历封装到一个 ...

  9. C++ 标准模板库(STL)——迭代器(iterators)的用法及理解

    C++ STL中迭代器(iterators)用于遍历对象集合的元素.由于容器大小随着插入删除等操作动态改变,无法像静态数组那样获取数组长度然后遍历容器里的所有元素:这时就需要迭代器,每次从容器内第一个 ...

  10. 用struts2标签如何从数据库获取数据并在查询页面显示。最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变量。

    最近做一个小项目,需要用到struts2标签从数据库查询数据,并且用迭代器iterator标签在查询页面显示,可是一开始,怎么也获取不到数据,想了许久,最后发现,是自己少定义了一个变量,也就是var变 ...

随机推荐

  1. realestate.cei.gov.cn

    using AnfleCrawler.Common; using System; using System.Collections.Concurrent; using System.Collectio ...

  2. javaweb--上传文件UploadServlet1.java

    package cn.itcast.web.servlet; import java.io.File;import java.io.FileOutputStream;import java.io.IO ...

  3. KVC/KVO原理详解及编程指南

    一.简介 1.KVC简介 2.KVO简介 二.KVC相关技术 1.Key和Key Path 2.点语法和KVC 3.一对多关系(To-Many)中的集合访问器方法 4.键值验证(Key-Value V ...

  4. 51nod-1732 婚姻介绍所(后缀数组)

    题目大意:回答任意两个子串的最长公共前缀. 题目分析:后缀数组的模板题.但是输入输出都要外挂. 代码如下: # include<iostream> # include<cstdio& ...

  5. HDU 5943 Kingdom of Obsession

    题意:n个人编号为[s+1, s+n],有n个座位编号为[1,n],编号为 i 的人只能坐到编号为它的约数的座位,问每个人是否都有位置坐. 题解:由于质数只能坐到1或者它本身的位置上,所以如果[n+1 ...

  6. OpenGL矩阵类(C++)

    概述 创建&初始化 存取器 矩阵运算 变换函数 实例:模型视图矩阵 实例:投影矩阵 概述 OpenGL固定功能管线提供4个不同类型的矩阵(GL_MODELVIEW.GL_PROJECTION. ...

  7. Docker SSH

    1. Dockerfile   -->docker build -t centos6-ssh https://git.oschina.net/feedao/Docker_shell/raw/st ...

  8. MySql取得日期(前一天、某一天)

    在测试一个统计表格,发现每次手写一个地址实在很烦,干脆就搞个自动计算好时间区间的东西.以下内容作为收获吧! 取得当天: SELECT curdate(); mysql> SELECT curda ...

  9. 一步步构建自己的AngularJS(1)——项目初始化

    Angular1距离2009年发布已经好多年了,Angular2也已经出了Beta版,估计今年就能正式发布.大多数人对于Angular1.X的认识仅限于能够在项目中使用,对于其中的深层原理知道的并不多 ...

  10. 【转载-好文】使用 Spring 2.5 注释驱动的 IoC 功能

    在 IBM Bluemix 云平台上开发并部署您的下一个应用. 开始您的试用 原文链接:https://www.ibm.com/developerworks/cn/java/j-lo-spring25 ...