SGI

value_type

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

原型

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

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

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

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

template <class T> inline T* value_type(const T*);

说明

Value_type是一个 迭代器标签 函数:用于确定与迭代器关联的值类型。迭代器的值类型是在迭代器解除引用时返回的对象类型;输出迭代器 没有值类型 (输出迭代器 只能用于存放值,不能用于访问值),但 输入迭代器正向迭代器双向迭代器随机访问迭代器 都具有值类型。 [1] 在某些情况下,例如必须声明一个局部变量来保存从解除迭代器引用返回的值的算法中,需要找出迭代器值类型。因此,value_type(Iter)返回(T*) 0,其中TIter的值类型。

尽管value_type看起来像是一个单个函数,其返回类型依赖于它的参数类型,但实际上它是函数集;名称value_type已重载。函数value_type必须针对每个迭代器类型重载 [1]

在实践中,确保value_type的定义实际上根本不需要工作。它已经针对指针定义,并且针对基类input_iterator, forward_iterator, bidirectional_iteratorrandom_access_iterator已定义。如果您正在实现一个新类型的正向迭代器,例如,您可以简单地从基类forward_iterator派生它;这意味着value_type(以及iterator_categorydistance_type) 将自动为您的迭代器定义。这些基类是空类:它们不包含成员函数或成员变量,只包含类型信息。因此,使用它们不会产生开销。

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

定义

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

对类型的要求

的参数value_type必须是 输入迭代器正向迭代器双向迭代器随机访问迭代器[1]

先决条件

无。Value_type的参数甚至允许是奇异迭代器。

复杂度

至多摊还固定时间。在许多情况下,编译器应该能够完全优化value_type整个过程。

示例

此示例使用value_type迭代标记函数用来声明迭代器值类型的临时变量。
template <class ForwardIterator1, class ForwardIterator2, class ValueType>
inline void __iter_swap(ForwardIterator1 a, ForwardIterator2 b, ValueType*) {
    T tmp = *a;
    *a = *b;
    *b = tmp;
}

template <class ForwardIterator1, class ForwardIterator2>
inline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) {
    __iter_swap(a, b, value_type(a));
}

说明

[1] 请注意distance_type未定义用于 Output IteratorsTrivial Iterators。在 Output Iterators 的情况下,这是因为 Output Iterator 没有值类型:无法对 Output Iterator 进行解除引用并获取值。在 Trivial Iterators 的情况下,这是因为此概念仅为概念清晰而引入,以便将与某个对象相关的公理从与在范围上进行迭代相关的公理中分离。事实上,STL 未定义任何 Trivial Iterators 类型。虽然内置 C 指针可能是 Trivial Iterators,但 C 类型系统不允许区分 Trivial Iterators 指针和 Random Access Iterators 指针,这些指针进入 C 数组。因此,没有 Trivial Iterator 类别标记或迭代器基。

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

另见

有关 Iterator Tags 的概述iterator_traits, iterator_category, distance_type, output_iterator_tag, input_iterator_tag, forward_iterator_tag, bidirectional_iterator_tag, random_access_iterator_tag
[Silicon Surf] [STL Home]
Copyright © 1999 Silicon Graphics, Inc. All Rights Reserved. 商标信息