迭代器概念

//迭代器是一种smart pointer
template<typename T>
class ListItem
{
public:
    T value()const
    {
        return _value;
    }
    ListItem *next()const
    {
        return _next;
    }
private:
    T _value;
    ListItem *_next;
};

template<class T>
class List
{
public:
    void insert_front(T value);
    void insert_end(T value);
    void display(ostream&os = cout)const;
private:
    ListItem<T>*_end;
    ListItem<T>*_front;
    long _size;
};

//为链表设计一个迭代器,要设计迭代器,必须要对容器有足够的了解
//所以list和对应的迭代器的设计都由list的设计者实现,从而封装实现细节
template<class Item>
struct ListIter
{
    Item *ptr;//保持与容器之间的一个联系,ptr是list结点指针
    ListIter(Item *p = 0) :ptr(p){}

    //迭代器行为类似指针,其中最常见的操作是内容提领和成员访问
    //所以要对operator*和operator->进行重载,可参考auto_ptr的实现
    Item& operator*()const
    {
        return *ptr;
    }
    //重构->,返回值必须为一个指针或可以应用 -> 操作的类型
    Item* operator->()const
    {
        return ptr;
    }
    //前增量,返回引用(迭代器对象)
    ListIter& operator++()
    {
        ptr = ptr->next();
        return *this;
    }
    //后增量,返回值
    ListIter operator++(int)
    {
        ListIter tmp = *this;
        ++*this;//利用前面对++的重载
        return tmp;
    }

    bool operator==(const ListIter& i)const
    {
        return ptr == i.ptr;
    }
    bool operator!=(const ListIter& i)const
    {
        return ptr != i.ptr;
    }
};
//如何获取迭代器所指类型
template<class T>
struct MyIter
{
    typedef T value_type;//迭代器所指对象类型
    T *ptr;
    //....
};

template<class I>
//函数func接受一个迭代器参数,返回值是迭代器所指对象类型
//typename告诉编译器I是一个类型,使得能够通过编译
typename I::value_type func(I ite)
{
    return *ite;
}

//类模板用于萃取迭代器特性,I为迭代器类型
template<class I>
struct iterator_traits
{
    typedef typename I::value_type value_type;//针对class
};
//原生指针不是class,无法定义内嵌型别
//traits可以拥有特化版本,T *为原生指针int *,则T也就是value_type为int
template<class T>
struct iterator_traits<T*>
{
    typedef T value_type;//针对原生指针
};

//萃取机完整版本(最常用到的迭代器五种类型)
//若使容器能与STL兼容,必须要为容器的迭代器定义以下五种相应型别
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;//迭代器所指对象的引用
};

/*
迭代器有五种类型,Input Iterator,output Iterator,Forward Iterator只支持++,Biderectional Iterator支持++、--,Random Access Iterator支持
所有运算,效率最高
*/
struct input_iterator_tag{};
struct output_iterator_tag{};
struct forward_iterator_tag :public input_iterator_tag{};
struct bidirectional_iterator_tag :public forward_iterator_tag{};
struct random_access_iterator_tag :public bidirectional_iterator_tag{};
//第三参数,使如下函数形成重载
template <class InputIterator,class Distance>
inline void _advance(InputIterator& i, Distance n, input_iterator_tag)
{
    while (n--)
        i++;
}
//下面四个函数类似,不再详述
//对外开放的接口, iterator_traits<InputIterator>::iterator_category()将产生一个暂时对象,编译器根据对象
//类型决定调用哪一个_advance重载函数
//STL一个命名规则:以算法所能接受的最低阶迭代器类型来为其迭代器类型参数命名
template<class InputIterator,class Distance>
inline void advance(InputIterator& i, Distance n)
{
    _advance(i, n, iterator_traits<InputIterator>::iterator_category());
}

为了符合规范,任何迭代器都应该提供五个内嵌类型,以利于traits萃取,否则可能无法与其他STL组件顺利搭配。STL提供了一个iterators class如下,可让每个新设计的迭代器都继承自它。

//ptrdiff_t为c++内建类型,定义于<cstddef>
template <class Category,class T,class Distance=ptrdiff_t,class Pointer=T*,class Reference=T&>
struct iterator
{
    typedef Category iterator_category;
    typedef T value_type;
    typedef Distance difference_type;
    typedef Pointer pointer;
    typedef Reference reference;
};
时间: 2024-10-28 21:39:00

迭代器概念的相关文章

Python学习之旅—Day07(生成器与迭代器)

前言 本篇博客主要专注于解决函数中的一个重要知识点--生成器与迭代器.不管是面试还是工作,生成器与迭代器在实际工作中的运用可以说是非常多,从我们第一天开始学习for循环来遍历字典,列表等数据类型时,我们就已经和生成器,迭代器打交道了!本篇博客从最基础的基本概念,例如容器,可迭代对象,生成器,迭代器的概念,到for循环是怎么工作的娓娓道来.希望本篇博客能够帮助大家切实掌握生成器与迭代器的使用与底层原理. 一.容器 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用in

C++ STL 基础及应用(3) 迭代器

迭代器(Iterator)是 STL 的核心技术,提供了统一访问容器元素的方法,为编写通用算法提供了坚实的技术基础. 本章将带你编写一个自带迭代器的数组类和一个自带迭代器的链表类,模拟 STL 中的容器,这两个实例能够很清晰地展示 STL 的迭代器思想.并探讨迭代器类应该作为容器类的内部类的原因,然后对 STL 迭代器做一下归纳理解,最后阐述一下 STL 中真正的迭代器概况. 那么什么是迭代器呢? 迭代器即指针,可以是需要的任意类型,它的最大好处是可以使容器和算法分离.例如,有两个容器类,MyA

函数风云序列之迭代器与生成器

迭代器和生成器 一.迭代器 (概念) ?1.?可迭代协议--->:只要是含有'__iter__'方法的数据类型都是可迭代的数据类型? 判断么某个变量是不是可迭代的:? 第一种方式: print('__iter__' in dir([])) #是True就是可迭代的,是False就不是. 第二种方式: from collections import Iterable isinstance([],Iterable) 内置函数,判断一个具体的值是不是某个数据类型,括号里前面是具体的值,后面是数据类型.

STL 迭代器(iterator)详解

背景:指针可以用来遍历存储空间连续的数据结构,但是对于存储空间非连续的,就需要寻找一个行为类似指针的类,来对非数组的数据结构进行遍历.因此,我们引入迭代器概念. ? 一.迭代器(iterator)介绍 迭代器(Iterator)是一种检查容器内元素并遍历元素的数据类型.迭代器是指针的泛化,它允许程序员用相同的方式处理不同的数据结构(容器). 迭代器的功能 共有五种迭代器,各个迭代器的功能如下: 迭代器类别 说明 输入 从容器中读取元素.输入迭代器只能一次读入一个元素向前移动,输入迭代器只支持一遍

stl源码剖析学习笔记(二)traits编程技法简明例程

解释说明 traits侯捷老师的翻译是萃取.其目的就是在编译期进行模板调用的类型识别,从而做一些事情. 最突出的例子,我觉得不是<STL源码剖析>中"迭代器概念与traits编程技法"这一章的说明,而是stl算法中copy的实现.代码在stl源码的stl_algobase.h中. copy的最终实现,大致分为两类,一类是直接整块内存的memmove操作,另一类是一个个对象赋值.其中涉及has_trivial_assignment_operator的类型推断. 如果has_t

重温《STL源码剖析》笔记 第三章

第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼藉的内存泄漏问题可藉此获得解决. auto_ptr用法如下,和原生指针一模一样: void func() { auto_ptr<string> ps(new string("jjhou")); cout << *ps << endl; //输出:jjhou cout <<

《C++ Primer Plus》第16章 string类和标准模板库 学习笔记

C++提供了一组功能强大的库,这些库提供了很多常见编程问题的解决方案以及简化其他问题的工具string类为将字符串作为对象来处理提供了一种方便的方法.string类提供了自动内存管理动能以及众多处理字符串的方法和函数.例如,这些方法和函数让您能够合并字符串.将一个字符串插入到另一个字符串中.反转字符串.在字符串中搜索字符或姊姊富川以及执行输入和输出操作.诸如auto_ptr以及C++11新增的shared_ptr和unique_ptr等智能指针模板使得管理由new分配的内存更容易.如果使用这些智

SPL(PHP标准库)-----------------------个人笔记

<?php     ****************************************PHP高级程序员必修课******************************************************* //SPL:PHP标准库,Standand  PHP  Library   解决常见问题的一组接口与类的集合 /* 问题:数学建模/数据结构,解决数据如何存储的问题 元素便利,数据如何查看的问题 常用方法的统一调用(通用方法,自定义遍历) 类定义的自动装载 */ /

vector与list和各自iterator剖析2

迭代器是连接容器和算法的纽带,它们为数据提供了一种抽象的观点,使写算法的人不必关心多种多样的数据结构的具体细节. 1,迭代器概述 迭代器是指向序列元素的指针的一种抽象.通过使用迭代器,我们可以访问序列中的某个元素.改变序列中的某个元素的值.使迭代器向前或向后行走等等. 依据有效执行操作的情况,迭代器可以分为五类:输入迭代器.输出迭代器.前向迭代器.双向迭代器和随机存取迭代器.STL中用五个类来代表这五种迭代器类别: 其中 · Input Iterator 所指的对象不允许外界改变 · Outpu