2003-08-05 19:48:41 +00:00
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
< html xmlns = "http://www.w3.org/1999/xhtml" xml:lang = "en" lang = "en" >
< head >
< meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" / >
2004-01-12 02:49:55 +00:00
< meta name = "generator" content = "Docutils 0.3.1: http://docutils.sourceforge.net/" / >
2003-08-05 19:48:41 +00:00
< title > Counting Iterator< / title >
< meta name = "author" content = "David Abrahams, Jeremy Siek, Thomas Witt" / >
< meta name = "organization" content = "Boost Consulting, Indiana University Open Systems Lab, University of Hanover Institute for Transport Railway Operation and Construction" / >
2004-01-12 01:30:47 +00:00
< meta name = "date" content = "2004-01-12" / >
2003-09-14 02:17:41 +00:00
< meta name = "copyright" content = "Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved" / >
2004-01-12 02:49:55 +00:00
< style type = "text/css" > < ! --
/*
:Author: David Goodger
:Contact: goodger@users.sourceforge.net
:date: $Date$
:version: $Revision$
:copyright: This stylesheet has been placed in the public domain.
Default cascading style sheet for the HTML output of Docutils.
*/
. first {
margin-top : 0 }
. last {
margin-bottom : 0 }
a . toc-backref {
text-decoration : none ;
color : black }
dd {
margin-bottom : 0.5 em }
div . abstract {
margin : 2 em 5 em }
div . abstract p . topic-title {
font-weight : bold ;
text-align : center }
div . attention , div . caution , div . danger , div . error , div . hint ,
div . important , div . note , div . tip , div . warning , div . admonition {
margin : 2 em ;
border : medium outset ;
padding : 1 em }
div . attention p . admonition-title , div . caution p . admonition-title ,
div . danger p . admonition-title , div . error p . admonition-title ,
div . warning p . admonition-title {
color : red ;
font-weight : bold ;
font-family : sans-serif }
div . hint p . admonition-title , div . important p . admonition-title ,
div . note p . admonition-title , div . tip p . admonition-title ,
div . admonition p . admonition-title {
font-weight : bold ;
font-family : sans-serif }
div . dedication {
margin : 2 em 5 em ;
text-align : center ;
font-style : italic }
div . dedication p . topic-title {
font-weight : bold ;
font-style : normal }
div . figure {
margin-left : 2 em }
div . footer , div . header {
font-size : smaller }
div . sidebar {
margin-left : 1 em ;
border : medium outset ;
padding : 0 em 1 em ;
background-color : #ffffee ;
width : 40 % ;
float : right ;
clear : right }
div . sidebar p . rubric {
font-family : sans-serif ;
font-size : medium }
div . system-messages {
margin : 5 em }
div . system-messages h1 {
color : red }
div . system-message {
border : medium outset ;
padding : 1 em }
div . system-message p . system-message-title {
color : red ;
font-weight : bold }
div . topic {
margin : 2 em }
h1 . title {
text-align : center }
h2 . subtitle {
text-align : center }
hr {
width : 75 % }
ol . simple , ul . simple {
margin-bottom : 1 em }
ol . arabic {
list-style : decimal }
ol . loweralpha {
list-style : lower-alpha }
ol . upperalpha {
list-style : upper-alpha }
ol . lowerroman {
list-style : lower-roman }
ol . upperroman {
list-style : upper-roman }
p . attribution {
text-align : right ;
margin-left : 50 % }
p . caption {
font-style : italic }
p . credits {
font-style : italic ;
font-size : smaller }
p . label {
white-space : nowrap }
p . rubric {
font-weight : bold ;
font-size : larger ;
color : maroon ;
text-align : center }
p . sidebar-title {
font-family : sans-serif ;
font-weight : bold ;
font-size : larger }
p . sidebar-subtitle {
font-family : sans-serif ;
font-weight : bold }
p . topic-title {
font-weight : bold }
pre . address {
margin-bottom : 0 ;
margin-top : 0 ;
font-family : serif ;
font-size : 100 % }
pre . line-block {
font-family : serif ;
font-size : 100 % }
pre . literal-block , pre . doctest-block {
margin-left : 2 em ;
margin-right : 2 em ;
background-color : #eeeeee }
span . classifier {
font-family : sans-serif ;
font-style : oblique }
span . classifier-delimiter {
font-family : sans-serif ;
font-weight : bold }
span . interpreted {
font-family : sans-serif }
span . option {
white-space : nowrap }
span . option-argument {
font-style : italic }
span . pre {
white-space : pre }
span . problematic {
color : red }
table {
margin-top : 0.5 em ;
margin-bottom : 0.5 em }
table . citation {
border-left : solid thin gray ;
padding-left : 0.5 ex }
table . docinfo {
margin : 2 em 4 em }
table . footnote {
border-left : solid thin black ;
padding-left : 0.5 ex }
td , th {
padding-left : 0.5 em ;
padding-right : 0.5 em ;
vertical-align : top }
th . docinfo-name , th . field-name {
font-weight : bold ;
text-align : left ;
white-space : nowrap }
h1 tt , h2 tt , h3 tt , h4 tt , h5 tt , h6 tt {
font-size : 100 % }
tt {
background-color : #eeeeee }
ul . auto-toc {
list-style-type : none }
-- > < / style >
2003-08-05 19:48:41 +00:00
< / head >
< body >
< div class = "document" id = "counting-iterator" >
< h1 class = "title" > Counting Iterator< / h1 >
< table class = "docinfo" frame = "void" rules = "none" >
< col class = "docinfo-name" / >
< col class = "docinfo-content" / >
< tbody valign = "top" >
< tr > < th class = "docinfo-name" > Author:< / th >
< td > David Abrahams, Jeremy Siek, Thomas Witt< / td > < / tr >
< tr > < th class = "docinfo-name" > Contact:< / th >
< td > < a class = "first reference" href = "mailto:dave@boost-consulting.com" > dave@ boost-consulting.com< / a > , < a class = "reference" href = "mailto:jsiek@osl.iu.edu" > jsiek@ osl.iu.edu< / a > , < a class = "last reference" href = "mailto:witt@ive.uni-hannover.de" > witt@ ive.uni-hannover.de< / a > < / td > < / tr >
< tr > < th class = "docinfo-name" > Organization:< / th >
< td > < a class = "first reference" href = "http://www.boost-consulting.com" > Boost Consulting< / a > , Indiana University < a class = "reference" href = "http://www.osl.iu.edu" > Open Systems
Lab< / a > , University of Hanover < a class = "last reference" href = "http://www.ive.uni-hannover.de" > Institute for Transport
Railway Operation and Construction< / a > < / td > < / tr >
< tr > < th class = "docinfo-name" > Date:< / th >
2004-01-12 01:30:47 +00:00
< td > 2004-01-12< / td > < / tr >
2003-08-05 19:48:41 +00:00
< tr > < th class = "docinfo-name" > Copyright:< / th >
2003-09-14 02:17:41 +00:00
< td > Copyright David Abrahams, Jeremy Siek, and Thomas Witt 2003. All rights reserved< / td > < / tr >
2003-08-05 19:48:41 +00:00
< / tbody >
< / table >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > abstract:< / th > < td class = "field-body" > < / td >
< / tr >
< / tbody >
< / table >
2004-01-12 00:48:21 +00:00
< p > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > adapts an arithmetic type, such as < tt class = "literal" > < span class = "pre" > int< / span > < / tt > , by
adding an < tt class = "literal" > < span class = "pre" > operator*< / span > < / tt > that returns the current value of the object.< / p >
2003-08-05 19:48:41 +00:00
< div class = "contents topic" id = "table-of-contents" >
< p class = "topic-title" > < a name = "table-of-contents" > Table of Contents< / a > < / p >
< ul class = "simple" >
< li > < a class = "reference" href = "#counting-iterator-requirements" id = "id1" name = "id1" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > requirements< / a > < / li >
2004-01-12 00:48:21 +00:00
< li > < a class = "reference" href = "#counting-iterator-models" id = "id2" name = "id2" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > models< / a > < / li >
< li > < a class = "reference" href = "#counting-iterator-operations" id = "id3" name = "id3" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > operations< / a > < / li >
< li > < a class = "reference" href = "#example" id = "id4" name = "id4" > Example< / a > < / li >
2003-08-05 19:48:41 +00:00
< / ul >
< / div >
< pre class = "literal-block" >
2003-11-24 05:02:46 +00:00
template <
class Incrementable
2004-01-12 00:48:21 +00:00
, class CategoryOrTraversal = use_default
2003-11-24 05:02:46 +00:00
, class Difference = use_default
>
2003-08-05 19:48:41 +00:00
class counting_iterator
{
public:
counting_iterator();
counting_iterator(counting_iterator const& rhs);
2004-01-12 00:48:21 +00:00
explicit counting_iterator(Incrementable x);
Incrementable base() const;
2003-08-05 19:48:41 +00:00
private:
2004-01-12 00:48:21 +00:00
Incrementable current; // exposition
2003-08-05 19:48:41 +00:00
};
< / pre >
< dl >
< dt > [< em > Note:< / em > implementers are encouraged to provide an implementation of< / dt >
< dd > < tt class = "literal" > < span class = "pre" > distance_to< / span > < / tt > and a < tt class = "literal" > < span class = "pre" > difference_type< / span > < / tt > that avoids overflows in
the cases when the < tt class = "literal" > < span class = "pre" > Incrementable< / span > < / tt > type is a numeric type.]< / dd >
< / dl >
< div class = "section" id = "counting-iterator-requirements" >
< h1 > < a class = "toc-backref" href = "#id1" name = "counting-iterator-requirements" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > requirements< / a > < / h1 >
< p > The < tt class = "literal" > < span class = "pre" > Incrementable< / span > < / tt > type must be Default Constructible, Copy
Constructible, and Assignable. The default distance is
2004-01-12 00:48:21 +00:00
an implementation defined signed integral type.< / p >
< / div >
< div class = "section" id = "counting-iterator-models" >
< h1 > < a class = "toc-backref" href = "#id2" name = "counting-iterator-models" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > models< / a > < / h1 >
< p > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > models Readable Lvalue Iterator.< / p >
2003-08-05 19:48:41 +00:00
< p > Furthermore, if you wish to create a counting iterator that is a Forward
Traversal Iterator, then the following expressions must be valid:< / p >
< pre class = "literal-block" >
Incrementable i, j;
++i // pre-increment
i == j // operator equal
< / pre >
< p > If you wish to create a counting iterator that is a
Bidirectional Traversal Iterator, then pre-decrement is also required:< / p >
< pre class = "literal-block" >
--i
< / pre >
< p > If you wish to create a counting iterator that is a Random Access
Traversal Iterator, then these additional expressions are also
required:< / p >
< pre class = "literal-block" >
counting_iterator::difference_type n;
i += n
n = i - j
i < j
< / pre >
< / div >
< div class = "section" id = "counting-iterator-operations" >
2004-01-12 00:48:21 +00:00
< h1 > < a class = "toc-backref" href = "#id3" name = "counting-iterator-operations" > < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > operations< / a > < / h1 >
2003-08-05 19:48:41 +00:00
< p > < tt class = "literal" > < span class = "pre" > counting_iterator();< / span > < / tt > < / p >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > A default constructed instance of < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > .< / td >
< / tr >
< / tbody >
< / table >
< p > < tt class = "literal" > < span class = "pre" > counting_iterator(counting_iterator< / span > < span class = "pre" > const& < / span > < span class = "pre" > rhs);< / span > < / tt > < / p >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > An instance of < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > that is a copy of < tt class = "literal" > < span class = "pre" > rhs< / span > < / tt > .< / td >
< / tr >
< / tbody >
< / table >
2004-01-12 00:48:21 +00:00
< p > < tt class = "literal" > < span class = "pre" > explicit< / span > < span class = "pre" > counting_iterator(Incrementable< / span > < span class = "pre" > x);< / span > < / tt > < / p >
2003-08-05 19:48:41 +00:00
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
2004-01-12 00:48:21 +00:00
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > An instance of < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > with < tt class = "literal" > < span class = "pre" > current< / span > < / tt >
constructed from < tt class = "literal" > < span class = "pre" > x< / span > < / tt > .< / td >
< / tr >
< / tbody >
< / table >
< p > < tt class = "literal" > < span class = "pre" > reference< / span > < span class = "pre" > operator*()< / span > < span class = "pre" > const;< / span > < / tt > < / p >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > < tt class = "literal" > < span class = "pre" > current< / span > < / tt > < / td >
< / tr >
< / tbody >
< / table >
< p > < tt class = "literal" > < span class = "pre" > counting_iterator& < / span > < span class = "pre" > operator++();< / span > < / tt > < / p >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Effects:< / th > < td class = "field-body" > < tt class = "literal" > < span class = "pre" > ++current< / span > < / tt > < / td >
< / tr >
< / tbody >
< / table >
< p > < tt class = "literal" > < span class = "pre" > Incrementable< / span > < span class = "pre" > base()< / span > < span class = "pre" > const;< / span > < / tt > < / p >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > < tt class = "literal" > < span class = "pre" > current< / span > < / tt > < / td >
< / tr >
< / tbody >
< / table >
< pre class = "literal-block" >
template < class Incrementable>
2004-01-12 01:30:47 +00:00
counting_iterator< Incrementable> make_counting_iterator(Incrementable x);
2004-01-12 00:48:21 +00:00
< / pre >
< table class = "field-list" frame = "void" rules = "none" >
< col class = "field-name" / >
< col class = "field-body" / >
< tbody valign = "top" >
< tr class = "field" > < th class = "field-name" > Returns:< / th > < td class = "field-body" > An instance of < tt class = "literal" > < span class = "pre" > counting_iterator< Incrementable> < / span > < / tt >
with < tt class = "literal" > < span class = "pre" > current< / span > < / tt > constructed from < tt class = "literal" > < span class = "pre" > x< / span > < / tt > .< / td >
2003-08-05 19:48:41 +00:00
< / tr >
< / tbody >
< / table >
< / div >
2004-01-12 00:48:21 +00:00
< div class = "section" id = "example" >
< h1 > < a class = "toc-backref" href = "#id4" name = "example" > Example< / a > < / h1 >
< p > This example fills an array with numbers and a second array with
pointers into the first array, using < tt class = "literal" > < span class = "pre" > counting_iterator< / span > < / tt > for both
tasks. Finally < tt class = "literal" > < span class = "pre" > indirect_iterator< / span > < / tt > is used to print out the numbers
into the first array via indirection through the second array.< / p >
< pre class = "literal-block" >
int N = 7;
std::vector< int> numbers;
typedef std::vector< int> ::iterator n_iter;
std::copy(boost::counting_iterator< int> (0),
boost::counting_iterator< int> (N),
std::back_inserter(numbers));
std::vector< std::vector< int> ::iterator> pointers;
std::copy(boost::make_counting_iterator(numbers.begin()),
boost::make_counting_iterator(numbers.end()),
std::back_inserter(pointers));
std::cout < < " indirectly printing out the numbers from 0 to "
< < N < < std::endl;
std::copy(boost::make_indirect_iterator(pointers.begin()),
boost::make_indirect_iterator(pointers.end()),
std::ostream_iterator< int> (std::cout, " " ));
std::cout < < std::endl;
< / pre >
< p > The output is:< / p >
< pre class = "literal-block" >
indirectly printing out the numbers from 0 to 7
0 1 2 3 4 5 6
< / pre >
2003-08-05 19:48:41 +00:00
< / div >
2003-09-14 02:17:41 +00:00
< / div >
2004-01-12 02:49:55 +00:00
< hr class = "footer" / >
< div class = "footer" >
< a class = "reference" href = "counting_iterator.rst" > View document source< / a > .
Generated on: 2004-01-12 02:46 UTC.
Generated by < a class = "reference" href = "http://docutils.sourceforge.net/" > Docutils< / a > from < a class = "reference" href = "http://docutils.sourceforge.net/rst.html" > reStructuredText< / a > source.
< / div >
2003-08-05 19:48:41 +00:00
< / body >
< / html >