iterator_traits(3C++) - iterator_traits(3C++)
Standard C++ Library Copyright 1998, Rogue Wave Software, Inc.
NAMEiterator_traits
- Returns basic information about an iterator.
SYNOPSIS
template <class Iterator> struct iterator_traits
{
typedef typename Iterator::value_type value_type;
typedef typename Iterator::difference_type
difference_type;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::reference reference;
typedef typename Iterator::iterator_category
iterator_category;
};
// Specialization
template <class T> struct iterator_traits<T*>
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
typedef random_access_iterator_tag iterator_category;
};
DESCRIPTION
The_iterator_traits template and specialization allows algorithms to
access information about a particular iterator in a uniform way. The
template requires either an iterator with a basic interface consisting
of the types value_type, difference_type, pointer, reference, and iter‐
ator_category, or it requires a specialization for the iterator. The
library includes one specialization (partial) to handle all pointer
iterator types.
iterator_traits are used within algorithms to create local variables of
either the type pointed to by the iterator or of the iterator's dis‐
tance type. The traits also improve the efficiency of algorithms by
making use of knowledge about basic iterator categories provided by the
iterator_category member. An algorithm can use this "tag" to select the
most efficient implementation an iterator is capable of handling with‐
out sacrificing the ability to work with a wide range of iterator
types. For instance, both the advance and distance primitives use iter‐
ator_category to maximize their efficiency by using the tag to select
from one of several different auxiliary functions. The iterator_cate‐
gory must therefore be one of the iterator tags included by the
library.
TAG TYPES
input_iterator_tag
output_iterator_tag
forward_iterator_tag
bidirectional_iterator_tag
random_access_iterator_tag
iterator_traits::iterator_category is typically used like this:
template <class Iterator>
void foo(Iterator first, Iterator last)
{
__foo(begin,end,
iterator_traits<Iterator>::iterator_category);
}
template <class Iterator>
void __foo(Iterator first, Iterator last,
input_iterator_tag>
{
// Most general implementation
}
template <class Iterator>
void __foo(Iterator first, Iterator last,
bidirectional_iterator_tag>
{
// Implementation takes advantage of bi-directional
// capability of the iterators
}
See the iterator section for a description of iterators and the capabilitiesassociated with each type of iterator tag.WARNINGS
If your compiler does not support partial specialization, then this
template and specialization are not available to you. Instead you need
to use the __distance_type, __value_type, and __iterator_category fami‐
lies of function templates. The Rogue Wave Standard C++ Library also
includes alternate implementations of the distance, advance, and count
functions when partial specialization is not supported by a particular
compiler.
If your compiler does not support namespaces, then you do not need the
using declaration for std.
SEE ALSO
__value_type, __distance_type, __iterator_category, distance, advance,
iterator
Rogue Wave Software 02 Apr 1998 iterator_traits(3C++)