SGI

distance_type

类别:迭代器 组件类型:函数

原型

Distance_type是重载的;实际上是五个不同的函数。
template <class T, class Distance> 
inline Distance* distance_type(const input_iterator<T, Distance>&);

template <class T, class Distance> 
inline Distance* distance_type(const forward_iterator<T, Distance>&);

template <class T, class Distance> 
inline Distance* distance_type(const bidirectional_iterator<T, Distance>&);

template <class T, class Distance> 
inline Distance* distance_type(const random_access_iterator<T, Distance>&);

template <class T> inline ptrdiff_t* distance_type(const T*);

描述

Distance_type是一个迭代器标签函数:它用于确定与迭代器关联的距离类型。一个输入迭代器前向迭代器双向迭代器随机访问迭代器 [1]必须与其关联一些有符号整型类型,用于表示该类型两个迭代器之间的距离。在某些情况下(例如,必须声明表示范围大小的局部变量的算法),需要找出迭代器的距离类型。因此,distance_type(Iter)返回(Distance*) 0,其中DistanceIter的距离类型。

尽管distance_type看起来像是一个返回值类型取决于其参数类型的单个函数,但实际上它是一组函数;名称distance_type是重载的。该函数distance_type必须为每种迭代器类型重载 [1]

在实践中,确保distance_type已定义几乎不需要任何工作。它已为指针以及基类input_iterator, forward_iterator, bidirectional_iteratorrandom_access_iterator定义。例如,如果您正在实现一种新的前向迭代器类型,则可以简单地将其从基类forward_iterator派生;这意味着distance_type(以及iterator_categoryvalue_type)将自动为您的迭代器定义。这些基类是空的:它们不包含任何成员函数或成员变量,而只包含类型信息。因此,使用它们不会产生任何开销。

请注意,虽然函数distance_type存在于原始 STL 中,但它不再存在于最新的 C++ 标准草案中:它已被iterator_traits类取代。目前,这两种机制都受支持 [2],但最终distance_type将被移除。

定义

在标准头文件 iterator 和非标准向后兼容头文件 iterator.h 中定义。此函数不再是 C++ 标准的一部分,尽管它存在于标准的早期草案中。在本次实现中保留它以实现向后兼容性。

类型要求

的论证distance_type必须是输入迭代器前向迭代器双向迭代器随机访问迭代器[1]

先决条件

无。Distance_type的论证甚至可以是单个迭代器。

复杂度

最多摊销常数时间。在许多情况下,编译器应该能够完全优化掉distance_type

示例

template <class RandomAccessIterator, class LessThanComparable, 
          class Distance>
RandomAccessIterator __lower_bound(RandomAccessIterator first,
                                   RandomAccessIterator last, 
                                   const LessThanComparable& value,
                                   Distance*)
    Distance len = last - first;
    Distance half;
    RandomAccessIterator middle;

    while (len > 0) {
        half = len / 2;
        middle = first + half;
        if (*middle < value) {
            first = middle + 1;
            len = len - half - 1;
        } else
            len = half;
    }
    return first;
}

template <class RandomAccessIterator, class LessThanComparable>
inline RandomAccessIterator lower_bound(RandomAccessIterator first,
                                        RandomAccessIterator last,
                                        const LessThanComparable& value) {
    return __lower_bound(first, last, value, distance_type(first));
}
算法lower_bound(一种二分查找)获取迭代器的范围,并且必须声明一个类型为迭代器距离类型的局部变量。它使用distance type和一个辅助函数,以便它可以声明该变量。 [3] 注意:这是一个简化的示例。实际算法lower_bound可以在随机访问迭代器的范围内或前向迭代器的范围内操作。它同时使用distance_typeiterator_category.

注释

[1] 请注意,distance_type未为输出迭代器平凡迭代器定义。这两个概念都没有距离的有效定义,因此不需要距离类型。

[2]iterator_traits类依赖于称为部分特化的 C++ 特性。当今许多编译器都没有实现完整的标准;特别是,许多编译器不支持部分特化。如果您的编译器不支持部分特化,那么您将无法使用iterator_traits,并且您将必须继续使用函数iterator_category, distance_typevalue_type。这是这些函数尚未删除的一个原因。

[3] 这种辅助函数的使用是一种极其常见的习惯用法distance_type几乎总是与辅助函数一起使用,仅仅因为它以难以以其他任何方式使用的方式返回类型信息。这是distance_typeiterator_traits.

不方便得多的原因之一

另请参阅iterator_traits, iterator_category, value_type, 迭代器标签概述,, output_iterator_tag, input_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag
[Silicon Surf] [STL Home]
random_access_iterator_tag 商标信息