Man Page __iterator_category.3



                       Standard C++ Library
             Copyright 1998, Rogue Wave Software, Inc.



NAME

     __iterator_category

      - Determines the category to  which  an  iterator  belongs.
     This  function  is now obsolete. It is included for backward
     compatibility and to support compilers that do  not  include
     partial specialization.





SYNOPSIS

     #include <iterator>
     template <class Category, class T, class Distance,
              class Pointer, class Reference>
     inline Category __iterator_category
       (const iterator<Category, T, Distance, Pointer,
       Reference>&);
     template <class T>
     inline random_access_iterator_tag __iterator_category
       (const T*)





DESCRIPTION

     The___iterator_category family of function templates  allows
     you to determine the category to which any iterator belongs.
     The first function takes an iterator of a specific type  and
     returns  the  tag  for  that  type.  The last takes a T* and
     returns random_access_iterator_tag.





TAG TYPES

     input_iterator_tag
     output_iterator_tag
     forward_iterator_tag
     bidirectional_iterator_tag
     random_access_iterator_tag

     The __iterator_category function is particularly useful  for
     improving the efficiency of algorithms. An algorithm can use
     this function to select the most efficient implementation an
     iterator  is  capable  of  handling  without sacrificing the
     ability to work with a wide range  of  iterator  types.  For
     instance,  both  the  advance  and  distance  primitives use
     __iterator_category to maximize their  efficiency  by  using
     the  tag  returned from iterator_category to select from one
     of several different auxiliary functions. Because this is  a
     compile time selection, use of this primitive incurs no sig-
     nificant runtime overhead.

     __iterator_category is typically used like this:


     template <class Iterator>
     void foo(Iterator first, Iterator last)
     {
      __foo(begin,end,__iterator_category(first));
     }

     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 capabilities associated with each type of iterator tag.





SEE ALSO

     Other  iterator  primitives:    __distance_type,   distance,
     advance, iterator