zoukankan      html  css  js  c++  java
  • Effective C++ 条款47

    本节条款的题目:请使用trait classes来表示类型信息

    本节条款主要讲述的技术是怎样在编译期间实现对迭代器类型的推断,依据推断的类型进行最优处理。
    我们先来看一下迭代器的种类:
    1.input_iterator:仅仅读,仅仅能逐个前移
    2.output_iterator:仅仅写,仅仅能逐个前移
    3.forward_iterator:可读可写,仅仅能逐个前移
    4.bidirectional_iterator:可读可写,支持逐个前移和后移
    5.random_access_iterator:可读可写,支持随机訪问(随意步数移动)
    假设一下,假设有一个函数用于对迭代器指定移动次数d,我们怎样实现这个函数,以达到最理想的状态。
    我们肯定会处理迭代器是random access类型的情况和不是random access类型的情况。当时random access的时候,直接加减迭代器在常数时间内完毕,假设不是,仅仅能一步一步向前或向后移动。


    例如以下代码:

    template<typename Iter, typename DistT>
        void advance(IteT& iter,DistT d)
        {
            if(iter is a random access iterator)
                iter+=d;
            else
            {
                if(d>=0)
                    while(d--) ++iter;
                else 
                    while(d++) --iter;
            }
        }

    但是,我们怎么才干做到“iter is a random access iterator”在编译期间的实现?

    实现这个功能。须要下面几步,而且相对繁杂的几步。

    首先为每一种迭代器设置struct标签,每一个struct都是空的结构体,例如以下代码:

    struct input_iterator_tag{};
    
    struct output_iterator_tag{};
    
    struct forward_iterator_tag: public input_iterator_tag{};
    
    struct bidirectional_iterator: public forward_iterator_tag{};
    
    struct random_access_iterator: public bidirectional_iterator_tag{};

    接着。我们就要引入traits,traits是一种技术,我们通过程序来看一下这是什么技术。有什么用。
    我们来看一下关于各种容器的定义:

    template class <T>
    class vector
    {
    public:
        class iterator
        {
        public:
            typedef random_access_iterator iterator_category;
            …
        }
        …
    }
    
    
    template class <T>
    class list
    {
    public:
        class iterator
        {
        public:
            typedef bidirectional_iterator iterator_category;
            …
        }
        …
    }

    从上面代码能够看出,每一个容器中都有一个iterator类。但是每一个iterator类中的迭代器标签却不一样。
    当我们调用语句vector<int>::iterator::iterator_category时会返回random_access_iterator类的类型,当我们调用list<int>::iterator::iterator_category时会返回bidirectional_iterator类的类型。
    我们再来看一下有关iterator_traits结构体的定义,

    template<typename IterT>
        struct iterator_traits{
            typedef typename IterT::iterator_category iterator_category;//typedef typename的使用见条款42
        };

    假设我们通过语句iterator_traits<vector<int>::iterator>::iterator_category调用就会返回有关vector<int>迭代器iterator的类型,该语句返回random_access_iterator类型。
    同理iterator_traits<list<int>::iterator>::it

  • 相关阅读:
    程其襄实变函数与泛函分析课件
    谢惠民答案
    谢惠民 数学分析习题课讲义 答案
    谢惠民数学分析习题课讲义下册参考解答
    重磅! 谢惠民下册参考解答已经全部完成, 共 473 页!
    各大高校考研试题参考解答目录2020/06/21版
    Jenkins Pipeline审批
    Zabbix监控DHCP作用域(json格式数据)
    MDT通过UserExit.vbs调用PowerShell脚本获取变量
    MDT通过PowerShell脚本自定义变量(自定义计算机名)
  • 原文地址:https://www.cnblogs.com/llguanli/p/6795992.html
Copyright © 2011-2022 走看看