blob: ec29081dcf9a80a338820db11e0e046c963b4c07 [file] [log] [blame]
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed
with this work for additional information regarding copyright
ownership. The ASF licenses this file to you under the Apache
License, Version 2.0 (the License); you may not use this file
except in compliance with the License. You may obtain a copy of
the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied. See the License for the specific language governing
permissions and limitations under the License.
Copyright 1999-2007 Rogue Wave Software, Inc.
-->
<HTML>
<HEAD>
<TITLE>iterator_traits</TITLE>
<LINK REL=StyleSheet HREF="../rw.css" TYPE="text/css" TITLE="Apache stdcxx Stylesheet"></HEAD>
<BODY BGCOLOR=#FFFFFF>
<A HREF="iterator.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="iterators.html"><IMG SRC="images/bnext.gif" WIDTH=25 HEIGHT=21 ALT="Next file" BORDER=O></A><DIV CLASS="DOCUMENTNAME"><B>Apache C++ Standard Library Reference Guide</B></DIV>
<H2>iterator_traits</H2>
<P><B>Library:</B>&nbsp;&nbsp;<A HREF="2-8.html">Iterators</A></P>
<PRE><HR><B><I>Does not inherit</I></B><HR></PRE>
<UL>
<LI><A HREF="#sec1">Local Index</A></LI>
<LI><A HREF="#sec2">Summary</A></LI>
<LI><A HREF="#sec3">Synopsis</A></LI>
<LI><A HREF="#sec4">Description</A></LI>
<LI><A HREF="#sec5">Interface</A></LI>
<LI><A HREF="#sec6">Tag Types</A></LI>
<LI><A HREF="#sec7">See Also</A></LI>
<LI><A HREF="#sec8">Standards Conformance</A></LI>
</UL>
<A NAME="sec1"><H3>Local Index</H3></A>
No Entries
<A NAME="sec2"><H3>Summary</H3></A>
<P>Returns basic information about an iterator.</P>
<A NAME="sec3"><H3>Synopsis</H3></A>
<PRE>#include &lt;iterator&gt;
namespace std {
template &lt;class Iterator&gt;
struct <B>iterator_traits</B>;
}
</PRE>
<A NAME="sec4"><H3>Description</H3></A>
<P>The class template <B><I>iterator_traits</I></B> and its specializations allow 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 <SAMP>value_type</SAMP>, <SAMP>difference_type</SAMP>, <SAMP>pointer</SAMP>, <SAMP>reference</SAMP>, and <SAMP>iterator_category</SAMP>, or it requires a specialization for the iterator. The library includes partial specializations to handle all pointer types.</P>
<P><B><I>iterator_traits</I></B> are used within algorithms to create local variables of either the type pointed to by the iterator or of the iterator's distance type. The traits also improve the efficiency of algorithms by making use of knowledge about basic iterator categories provided by the <SAMP>iterator_category</SAMP> member. An algorithm can use this "tag" 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 <SAMP><A HREF="advance.html">advance()</A></SAMP> and <SAMP><A HREF="distance.html">distance()</A></SAMP> primitives use <SAMP>iterator_category</SAMP> to maximize their efficiency by using the tag to select from one of several different auxiliary functions. The <SAMP>iterator_category</SAMP> must therefore be one of the iterator tags included by the library.</P>
<A NAME="sec5"><H3>Interface</H3></A>
<UL><PRE>template &lt;class Iterator&gt;
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;
};
// Specializations for pointers
template &lt;class T&gt;
struct iterator_traits&lt;T*&gt;
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef value_type* pointer;
typedef value_type&amp; reference;
typedef random_access_iterator_tag iterator_category;
};
</PRE></UL>
<A NAME="sec6"><H3>Tag Types</H3></A>
<UL><PRE>struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag: input_iterator_tag {};
struct bidirectional_iterator_tag: forward_iterator_tag {};
struct random_access_iterator_tag:
bidirectional_iterator_tag {};
</PRE></UL>
<P><SAMP>iterator_traits&lt;&gt;::iterator_category</SAMP> is typically used like this:</P>
<UL><PRE>template &lt;class Iterator&gt;
void foo(Iterator start, Iterator finish)
{
foo(begin,end,
iterator_traits&lt;Iterator&gt;::iterator_category);
}
template &lt;class Iterator&gt;
void foo(Iterator start, Iterator finish,
input_iterator_tag&gt;
{
// Most general implementation
}
template &lt;class Iterator&gt;
void foo(Iterator start, Iterator finish,
bidirectional_iterator_tag&gt;
{
// Implementation takes advantage of bi-directional
// capability of the iterators
}
...etc.
</PRE></UL>
<P>See the <B><I><A HREF="iterator.html">iterator</A></I></B> section for a description of iterators and the capabilities associated with each type of iterator tag.</P>
<A NAME="sec7"><H3>See Also</H3></A>
<P><SAMP>__value_type()</SAMP>, <SAMP><A HREF="--distance-type.html">__distance_type()</A></SAMP>, <SAMP><A HREF="--iterator-category.html">__iterator_category()</A></SAMP>, <SAMP><A HREF="distance.html">distance()</A></SAMP>, <SAMP><A HREF="advance.html">advance()</A></SAMP>, <B><I><A HREF="iterator.html">iterator</A></I></B></P>
<A NAME="sec8"><H3>Standards Conformance</H3></A>
<P><I>ISO/IEC 14882:1998 -- International Standard for Information Systems -- Programming Language C++, Section 24.3.1</I></P>
<BR>
<HR>
<A HREF="iterator.html"><IMG SRC="images/bprev.gif" WIDTH=20 HEIGHT=21 ALT="Previous file" BORDER=O></A><A HREF="noframes.html"><IMG SRC="images/btop.gif" WIDTH=56 HEIGHT=21 ALT="Top of Document" BORDER=O></A><A HREF="booktoc.html"><IMG SRC="images/btoc.gif" WIDTH=56 HEIGHT=21 ALT="Contents" BORDER=O></A><A HREF="tindex.html"><IMG SRC="images/bindex.gif" WIDTH=56 HEIGHT=21 ALT="Index page" BORDER=O></A><A HREF="iterators.html"><IMG SRC="images/bnext.gif" WIDTH=20 HEIGHT=21 ALT="Next file" BORDER=O></A>
<!-- Google Analytics tracking code -->
<script src="http://www.google-analytics.com/urchin.js" type="text/javascript">
</script>
<script type="text/javascript">
_uacct = "UA-1775151-1";
urchinTracker();
</script>
<!-- end of Google Analytics tracking code -->
</BODY>
</HTML>