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. 制作一个顶部图片可以拉伸放大缩小效果的tableViewHeader

    最近负责公司项目个人中心的项目模块研发,首页是一个头部图片可以拉伸放大缩小效果的tableViewHeader,今天这个demo和教程我增加了模糊效果和头像缩小效果.具体效果如图: 如果这个效果是想要 ...

  2. HttpContext.Cache 详解

    提到HttpContext.Cache必然会想到Application,他们有什么共性和不同点呢,我们一一道来 相同点: 1.两者都是使用键值对来存储对象 2.两者都是应用程序同生命周期(在cache ...

  3. poj2502 最短路

    //Accepted 504 KB 16 ms //spfa最短路 //把n个地铁站作为n个顶点,边权为从一个站到另一个站的时间 //注意:地铁在相邻的两站之间是直线行驶,但其他的就不是了 #incl ...

  4. JavaScript字符串常用操作函数之学习笔记

    字符串简介 使用英文单引号或双引号括起来,如:’Hello’,”World”,但是不能首尾的单引号和双引号必须一致,交错使用,如果要打印单引号或者双引号,可以使用转义字符\’(单引号),\”(双引号) ...

  5. nl2br() 函数

    nl2br() 函数在字符串中的每个新行 (\n) 之前插入 HTML 换行符 (<br />).经常用于在线编辑的内容,以便显示. 用法:nl2br(string) 参数 描述 stri ...

  6. tensorflow1

    特征: 1 灵活 2 可移植性 3 和研究/生产联系 4 自动求导 5 语言选择:python,严谨的c++接口:未来扩展更多 6 最大性能化

  7. 地址(Address)——统一资源表示(URI)——WCF学习笔记(2)

    统一资源标识(URI) URI:Uniform Resource Identifier(统一资源标识),唯一地标识一个网络资源的同时也表示资源所处的位置的方式(资源访问所用的网络协议). URI结构: ...

  8. 用collectionview实现瀑布流-转

    算法总体思路 先说一下总体上的思路.既然图片的大小.位置各不一样,我们很自然地会想到需要算出每个item的frame,然后把这些frame赋值给当前item的UICollectionViewLayou ...

  9. XListView刷新

    package com.example.da; import java.util.ArrayList;import java.util.List; import com.badu.net.Networ ...

  10. ASP代码审计 -4.命令执行漏洞总结

    命令执行漏洞: 保存为cmd.asp,提交链接: http://localhost/cmd.asp?ip=127.0.0.1 即可执行命令 <%ip=request("ip" ...