类别:迭代器 | 组件类型:函数 |
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看起来像是一个返回值类型取决于其参数类型的单个函数,但实际上它是一组函数;名称distance_type是重载的。该函数distance_type必须为每种迭代器类型重载 [1]。
在实践中,确保distance_type已定义几乎不需要任何工作。它已为指针以及基类input_iterator, forward_iterator, bidirectional_iterator和random_access_iterator定义。例如,如果您正在实现一种新的前向迭代器类型,则可以简单地将其从基类forward_iterator派生;这意味着distance_type(以及iterator_category和value_type)将自动为您的迭代器定义。这些基类是空的:它们不包含任何成员函数或成员变量,而只包含类型信息。因此,使用它们不会产生任何开销。
请注意,虽然函数distance_type存在于原始 STL 中,但它不再存在于最新的 C++ 标准草案中:它已被iterator_traits类取代。目前,这两种机制都受支持 [2],但最终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_type和iterator_category.
[1] 请注意,distance_type未为输出迭代器或平凡迭代器定义。这两个概念都没有距离的有效定义,因此不需要距离类型。
[2] 该iterator_traits类依赖于称为部分特化的 C++ 特性。当今许多编译器都没有实现完整的标准;特别是,许多编译器不支持部分特化。如果您的编译器不支持部分特化,那么您将无法使用iterator_traits,并且您将必须继续使用函数iterator_category, distance_type和value_type。这是这些函数尚未删除的一个原因。
[3] 这种辅助函数的使用是一种极其常见的习惯用法distance_type几乎总是与辅助函数一起使用,仅仅因为它以难以以其他任何方式使用的方式返回类型信息。这是distance_type比iterator_traits.