1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Zip Iterator</title> 5<link rel="stylesheet" href="../../../../../../doc/src/boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../index.html" title="Chapter 1. Boost.Iterator"> 8<link rel="up" href="../specialized.html" title="Specialized Adaptors"> 9<link rel="prev" href="transform.html" title="Transform Iterator"> 10<link rel="next" href="../utilities.html" title="Utilities"> 11</head> 12<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 13<table cellpadding="2" width="100%"><tr> 14<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../boost.png"></td> 15<td align="center"><a href="../../../../../../index.html">Home</a></td> 16<td align="center"><a href="../../../../../../libs/libraries.htm">Libraries</a></td> 17<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 18<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 19<td align="center"><a href="../../../../../../more/index.htm">More</a></td> 20</tr></table> 21<hr> 22<div class="spirit-nav"> 23<a accesskey="p" href="transform.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../utilities.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h3 class="title"> 27<a name="iterator.specialized.zip"></a><a class="link" href="zip.html" title="Zip Iterator">Zip Iterator</a> 28</h3></div></div></div> 29<div class="toc"><dl class="toc"> 30<dt><span class="section"><a href="zip.html#iterator.specialized.zip.zip_example">Example</a></span></dt> 31<dt><span class="section"><a href="zip.html#iterator.specialized.zip.zip_reference">Reference</a></span></dt> 32</dl></div> 33<p> 34 The zip iterator provides the ability to parallel-iterate over several controlled 35 sequences simultaneously. A zip iterator is constructed from a tuple of iterators. 36 Moving the zip iterator moves all the iterators in parallel. Dereferencing 37 the zip iterator returns a tuple that contains the results of dereferencing 38 the individual iterators. 39 </p> 40<p> 41 The tuple of iterators is now implemented in terms of a Boost fusion sequence. 42 Because of this the 'tuple' may be any Boost fusion sequence and, for backwards 43 compatibility through a Boost fusion sequence adapter, a Boost tuple. Because 44 the 'tuple' may be any boost::fusion sequence the 'tuple' may also be any 45 type for which a Boost fusion adapter exists. This includes, among others, 46 a std::tuple and a std::pair. Just remember to include the appropriate Boost 47 fusion adapter header files for these other Boost fusion adapters. The zip_iterator 48 header file already includes the Boost fusion adapter header file for Boost 49 tuple, so you need not include it yourself to use a Boost tuple as your 'tuple'. 50 </p> 51<div class="section"> 52<div class="titlepage"><div><div><h4 class="title"> 53<a name="iterator.specialized.zip.zip_example"></a><a class="link" href="zip.html#iterator.specialized.zip.zip_example" title="Example">Example</a> 54</h4></div></div></div> 55<p> 56 There are two main types of applications of the <code class="computeroutput"><span class="identifier">zip_iterator</span></code>. 57 The first one concerns runtime efficiency: If one has several controlled 58 sequences of the same length that must be somehow processed, e.g., with 59 the <code class="computeroutput"><span class="identifier">for_each</span></code> algorithm, 60 then it is more efficient to perform just one parallel-iteration rather 61 than several individual iterations. For an example, assume that <code class="computeroutput"><span class="identifier">vect_of_doubles</span></code> and <code class="computeroutput"><span class="identifier">vect_of_ints</span></code> 62 are two vectors of equal length containing doubles and ints, respectively, 63 and consider the following two iterations: 64 </p> 65<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">beg1</span> <span class="special">=</span> <span class="identifier">vect_of_doubles</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> 66<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">end1</span> <span class="special">=</span> <span class="identifier">vect_of_doubles</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> 67<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">beg2</span> <span class="special">=</span> <span class="identifier">vect_of_ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> 68<span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">const_iterator</span> <span class="identifier">end2</span> <span class="special">=</span> <span class="identifier">vect_of_ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">();</span> 69 70<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">beg1</span><span class="special">,</span> <span class="identifier">end1</span><span class="special">,</span> <span class="identifier">func_0</span><span class="special">());</span> 71<span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span><span class="identifier">beg2</span><span class="special">,</span> <span class="identifier">end2</span><span class="special">,</span> <span class="identifier">func_1</span><span class="special">());</span> 72</pre> 73<p> 74 These two iterations can now be replaced with a single one as follows: 75 </p> 76<pre class="programlisting"><span class="identifier">std</span><span class="special">::</span><span class="identifier">for_each</span><span class="special">(</span> 77 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_zip_iterator</span><span class="special">(</span> 78 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">beg1</span><span class="special">,</span> <span class="identifier">beg2</span><span class="special">)</span> 79 <span class="special">),</span> 80 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_zip_iterator</span><span class="special">(</span> 81 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">make_tuple</span><span class="special">(</span><span class="identifier">end1</span><span class="special">,</span> <span class="identifier">end2</span><span class="special">)</span> 82 <span class="special">),</span> 83 <span class="identifier">zip_func</span><span class="special">()</span> 84 <span class="special">);</span> 85</pre> 86<p> 87 A non-generic implementation of <code class="computeroutput"><span class="identifier">zip_func</span></code> 88 could look as follows: 89 </p> 90<pre class="programlisting"><span class="keyword">struct</span> <span class="identifier">zip_func</span> <span class="special">:</span> 91 <span class="keyword">public</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">unary_function</span><span class="special"><</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">const</span> <span class="keyword">double</span><span class="special">&,</span> <span class="keyword">const</span> <span class="keyword">int</span><span class="special">&>&,</span> <span class="keyword">void</span><span class="special">></span> 92<span class="special">{</span> 93 <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">()(</span><span class="keyword">const</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">const</span> <span class="keyword">double</span><span class="special">&,</span> <span class="keyword">const</span> <span class="keyword">int</span><span class="special">&>&</span> <span class="identifier">t</span><span class="special">)</span> <span class="keyword">const</span> 94 <span class="special">{</span> 95 <span class="identifier">m_f0</span><span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special"><</span><span class="number">0</span><span class="special">>());</span> 96 <span class="identifier">m_f1</span><span class="special">(</span><span class="identifier">t</span><span class="special">.</span><span class="identifier">get</span><span class="special"><</span><span class="number">1</span><span class="special">>());</span> 97 <span class="special">}</span> 98 99<span class="keyword">private</span><span class="special">:</span> 100 <span class="identifier">func_0</span> <span class="identifier">m_f0</span><span class="special">;</span> 101 <span class="identifier">func_1</span> <span class="identifier">m_f1</span><span class="special">;</span> 102<span class="special">};</span> 103</pre> 104<p> 105 The second important application of the <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 106 is as a building block to make combining iterators. A combining iterator 107 is an iterator that parallel-iterates over several controlled sequences 108 and, upon dereferencing, returns the result of applying a functor to the 109 values of the sequences at the respective positions. This can now be achieved 110 by using the <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 111 in conjunction with the <code class="computeroutput"><span class="identifier">transform_iterator</span></code>. 112 </p> 113<p> 114 Suppose, for example, that you have two vectors of doubles, say <code class="computeroutput"><span class="identifier">vect_1</span></code> and <code class="computeroutput"><span class="identifier">vect_2</span></code>, 115 and you need to expose to a client a controlled sequence containing the 116 products of the elements of <code class="computeroutput"><span class="identifier">vect_1</span></code> 117 and <code class="computeroutput"><span class="identifier">vect_2</span></code>. Rather than 118 placing these products in a third vector, you can use a combining iterator 119 that calculates the products on the fly. Let us assume that <code class="computeroutput"><span class="identifier">tuple_multiplies</span></code> is a functor that works 120 like <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">multiplies</span></code>, except that it takes its 121 two arguments packaged in a tuple. Then the two iterators <code class="computeroutput"><span class="identifier">it_begin</span></code> and <code class="computeroutput"><span class="identifier">it_end</span></code> 122 defined below delimit a controlled sequence containing the products of 123 the elements of <code class="computeroutput"><span class="identifier">vect_1</span></code> 124 and <code class="computeroutput"><span class="identifier">vect_2</span></code>: 125 </p> 126<pre class="programlisting"><span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span> 127 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">const_iterator</span><span class="special">,</span> 128 <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">const_iterator</span> 129 <span class="special">></span> <span class="identifier">the_iterator_tuple</span><span class="special">;</span> 130 131<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">zip_iterator</span><span class="special"><</span> 132 <span class="identifier">the_iterator_tuple</span> 133 <span class="special">></span> <span class="identifier">the_zip_iterator</span><span class="special">;</span> 134 135<span class="keyword">typedef</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">transform_iterator</span><span class="special"><</span> 136 <span class="identifier">tuple_multiplies</span><span class="special"><</span><span class="keyword">double</span><span class="special">>,</span> 137 <span class="identifier">the_zip_iterator</span> 138 <span class="special">></span> <span class="identifier">the_transform_iterator</span><span class="special">;</span> 139 140<span class="identifier">the_transform_iterator</span> <span class="identifier">it_begin</span><span class="special">(</span> 141 <span class="identifier">the_zip_iterator</span><span class="special">(</span> 142 <span class="identifier">the_iterator_tuple</span><span class="special">(</span> 143 <span class="identifier">vect_1</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> 144 <span class="identifier">vect_2</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()</span> 145 <span class="special">)</span> 146 <span class="special">),</span> 147 <span class="identifier">tuple_multiplies</span><span class="special"><</span><span class="keyword">double</span><span class="special">>()</span> 148 <span class="special">);</span> 149 150<span class="identifier">the_transform_iterator</span> <span class="identifier">it_end</span><span class="special">(</span> 151 <span class="identifier">the_zip_iterator</span><span class="special">(</span> 152 <span class="identifier">the_iterator_tuple</span><span class="special">(</span> 153 <span class="identifier">vect_1</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> 154 <span class="identifier">vect_2</span><span class="special">.</span><span class="identifier">end</span><span class="special">()</span> 155 <span class="special">)</span> 156 <span class="special">),</span> 157 <span class="identifier">tuple_multiplies</span><span class="special"><</span><span class="keyword">double</span><span class="special">>()</span> 158 <span class="special">);</span> 159</pre> 160</div> 161<div class="section"> 162<div class="titlepage"><div><div><h4 class="title"> 163<a name="iterator.specialized.zip.zip_reference"></a><a class="link" href="zip.html#iterator.specialized.zip.zip_reference" title="Reference">Reference</a> 164</h4></div></div></div> 165<h3> 166<a name="iterator.specialized.zip.zip_reference.h0"></a> 167 <span class="phrase"><a name="iterator.specialized.zip.zip_reference.synopsis"></a></span><a class="link" href="zip.html#iterator.specialized.zip.zip_reference.synopsis">Synopsis</a> 168 </h3> 169<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">IteratorTuple</span><span class="special">></span> 170<span class="keyword">class</span> <span class="identifier">zip_iterator</span> 171<span class="special">{</span> 172 173<span class="keyword">public</span><span class="special">:</span> 174 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">reference</span><span class="special">;</span> 175 <span class="keyword">typedef</span> <span class="identifier">reference</span> <span class="identifier">value_type</span><span class="special">;</span> 176 <span class="keyword">typedef</span> <span class="identifier">value_type</span><span class="special">*</span> <span class="identifier">pointer</span><span class="special">;</span> 177 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">difference_type</span><span class="special">;</span> 178 <span class="keyword">typedef</span> <span class="comment">/* see below */</span> <span class="identifier">iterator_category</span><span class="special">;</span> 179 180 <span class="identifier">zip_iterator</span><span class="special">();</span> 181 <span class="identifier">zip_iterator</span><span class="special">(</span><span class="identifier">IteratorTuple</span> <span class="identifier">iterator_tuple</span><span class="special">);</span> 182 183 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">OtherIteratorTuple</span><span class="special">></span> 184 <span class="identifier">zip_iterator</span><span class="special">(</span> 185 <span class="keyword">const</span> <span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">OtherIteratorTuple</span><span class="special">>&</span> <span class="identifier">other</span> 186 <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special"><</span> 187 <span class="identifier">OtherIteratorTuple</span> 188 <span class="special">,</span> <span class="identifier">IteratorTuple</span><span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition only</span> 189 <span class="special">);</span> 190 191 <span class="keyword">const</span> <span class="identifier">IteratorTuple</span><span class="special">&</span> <span class="identifier">get_iterator_tuple</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 192 193<span class="keyword">private</span><span class="special">:</span> 194 <span class="identifier">IteratorTuple</span> <span class="identifier">m_iterator_tuple</span><span class="special">;</span> <span class="comment">// exposition only</span> 195<span class="special">};</span> 196 197<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">IteratorTuple</span><span class="special">></span> 198<span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">IteratorTuple</span><span class="special">></span> 199<span class="identifier">make_zip_iterator</span><span class="special">(</span><span class="identifier">IteratorTuple</span> <span class="identifier">t</span><span class="special">);</span> 200</pre> 201<p> 202 The <code class="computeroutput"><span class="identifier">reference</span></code> member of 203 <code class="computeroutput"><span class="identifier">zip_iterator</span></code> is the type 204 of the tuple made of the reference types of the iterator types in the 205 <code class="computeroutput"><span class="identifier">IteratorTuple</span></code> argument. 206 </p> 207<p> 208 The <code class="computeroutput"><span class="identifier">difference_type</span></code> member 209 of <code class="computeroutput"><span class="identifier">zip_iterator</span></code> is the 210 <code class="computeroutput"><span class="identifier">difference_type</span></code> of the 211 first of the iterator types in the <code class="computeroutput"><span class="identifier">IteratorTuple</span></code> 212 argument. 213 </p> 214<p> 215 The <code class="computeroutput"><span class="identifier">iterator_category</span></code> member 216 of <code class="computeroutput"><span class="identifier">zip_iterator</span></code> is convertible 217 to the minimum of the traversal categories of the iterator types in the 218 <code class="computeroutput"><span class="identifier">IteratorTuple</span></code> argument. 219 For example, if the <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 220 holds only vector iterators, then <code class="computeroutput"><span class="identifier">iterator_category</span></code> 221 is convertible to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">random_access_traversal_tag</span></code>. 222 If you add a list iterator, then <code class="computeroutput"><span class="identifier">iterator_category</span></code> 223 will be convertible to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">bidirectional_traversal_tag</span></code>, 224 but no longer to <code class="computeroutput"><span class="identifier">boost</span><span class="special">::</span><span class="identifier">random_access_traversal_tag</span></code>. 225 </p> 226<h3> 227<a name="iterator.specialized.zip.zip_reference.h1"></a> 228 <span class="phrase"><a name="iterator.specialized.zip.zip_reference.requirements"></a></span><a class="link" href="zip.html#iterator.specialized.zip.zip_reference.requirements">Requirements</a> 229 </h3> 230<p> 231 All iterator types in the argument <code class="computeroutput"><span class="identifier">IteratorTuple</span></code> 232 shall model Readable Iterator. 233 </p> 234<h3> 235<a name="iterator.specialized.zip.zip_reference.h2"></a> 236 <span class="phrase"><a name="iterator.specialized.zip.zip_reference.concepts"></a></span><a class="link" href="zip.html#iterator.specialized.zip.zip_reference.concepts">Concepts</a> 237 </h3> 238<p> 239 The resulting <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 240 models Readable Iterator. 241 </p> 242<p> 243 The fact that the <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 244 models only Readable Iterator does not prevent you from modifying the values 245 that the individual iterators point to. The tuple returned by the <code class="computeroutput"><span class="identifier">zip_iterator</span></code>'s <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code> is a tuple constructed from the reference 246 types of the individual iterators, not their value types. For example, 247 if <code class="computeroutput"><span class="identifier">zip_it</span></code> is a <code class="computeroutput"><span class="identifier">zip_iterator</span></code> whose first member iterator 248 is an <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special"><</span><span class="keyword">double</span><span class="special">>::</span><span class="identifier">iterator</span></code>, then the following line will 249 modify the value which the first member iterator of <code class="computeroutput"><span class="identifier">zip_it</span></code> 250 currently points to: 251 </p> 252<pre class="programlisting"><span class="identifier">zip_it</span><span class="special">-></span><span class="identifier">get</span><span class="special"><</span><span class="number">0</span><span class="special">>()</span> <span class="special">=</span> <span class="number">42.0</span><span class="special">;</span> 253</pre> 254<p> 255 Consider the set of standard traversal concepts obtained by taking the 256 most refined standard traversal concept modeled by each individual iterator 257 type in the <code class="computeroutput"><span class="identifier">IteratorTuple</span></code> 258 argument.The <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 259 models the least refined standard traversal concept in this set. 260 </p> 261<p> 262 <code class="computeroutput"><span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">IteratorTuple1</span><span class="special">></span></code> 263 is interoperable with <code class="computeroutput"><span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">IteratorTuple2</span><span class="special">></span></code> if and only if <code class="computeroutput"><span class="identifier">IteratorTuple1</span></code> 264 is interoperable with <code class="computeroutput"><span class="identifier">IteratorTuple2</span></code>. 265 </p> 266<h3> 267<a name="iterator.specialized.zip.zip_reference.h3"></a> 268 <span class="phrase"><a name="iterator.specialized.zip.zip_reference.operations"></a></span><a class="link" href="zip.html#iterator.specialized.zip.zip_reference.operations">Operations</a> 269 </h3> 270<p> 271 In addition to the operations required by the concepts modeled by <code class="computeroutput"><span class="identifier">zip_iterator</span></code>, <code class="computeroutput"><span class="identifier">zip_iterator</span></code> 272 provides the following operations. 273 </p> 274<pre class="programlisting"><span class="identifier">zip_iterator</span><span class="special">();</span> 275</pre> 276<p> 277 <span class="bold"><strong>Returns:</strong></span> An instance of <code class="computeroutput"><span class="identifier">zip_iterator</span></code> with <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code> 278 default constructed. 279 </p> 280<pre class="programlisting"><span class="identifier">zip_iterator</span><span class="special">(</span><span class="identifier">IteratorTuple</span> <span class="identifier">iterator_tuple</span><span class="special">);</span> 281</pre> 282<p> 283 <span class="bold"><strong>Returns:</strong></span> An instance of <code class="computeroutput"><span class="identifier">zip_iterator</span></code> with <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code> 284 initialized to <code class="computeroutput"><span class="identifier">iterator_tuple</span></code>. 285 </p> 286<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">OtherIteratorTuple</span><span class="special">></span> 287<span class="identifier">zip_iterator</span><span class="special">(</span> 288 <span class="keyword">const</span> <span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">OtherIteratorTuple</span><span class="special">>&</span> <span class="identifier">other</span> 289 <span class="special">,</span> <span class="keyword">typename</span> <span class="identifier">enable_if_convertible</span><span class="special"><</span> 290 <span class="identifier">OtherIteratorTuple</span> 291 <span class="special">,</span> <span class="identifier">IteratorTuple</span><span class="special">>::</span><span class="identifier">type</span><span class="special">*</span> <span class="special">=</span> <span class="number">0</span> <span class="comment">// exposition only</span> 292<span class="special">);</span> 293</pre> 294<p> 295 <span class="bold"><strong>Returns:</strong></span> An instance of <code class="computeroutput"><span class="identifier">zip_iterator</span></code> that is a copy of <code class="computeroutput"><span class="identifier">other</span></code>.<br> <span class="bold"><strong>Requires:</strong></span> 296 <code class="computeroutput"><span class="identifier">OtherIteratorTuple</span></code> is implicitly 297 convertible to <code class="computeroutput"><span class="identifier">IteratorTuple</span></code>. 298 </p> 299<pre class="programlisting"><span class="keyword">const</span> <span class="identifier">IteratorTuple</span><span class="special">&</span> <span class="identifier">get_iterator_tuple</span><span class="special">()</span> <span class="keyword">const</span><span class="special">;</span> 300</pre> 301<p> 302 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code> 303 </p> 304<pre class="programlisting"><span class="identifier">reference</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span><span class="special">;</span> 305</pre> 306<p> 307 <span class="bold"><strong>Returns:</strong></span> A tuple consisting of the results 308 of dereferencing all iterators in <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code>. 309 </p> 310<pre class="programlisting"><span class="identifier">zip_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">++();</span> 311</pre> 312<p> 313 <span class="bold"><strong>Effects:</strong></span> Increments each iterator in 314 <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code>.<br> 315 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 316 </p> 317<pre class="programlisting"><span class="identifier">zip_iterator</span><span class="special">&</span> <span class="keyword">operator</span><span class="special">--();</span> 318</pre> 319<p> 320 <span class="bold"><strong>Effects:</strong></span> Decrements each iterator in 321 <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code>.<br> 322 <span class="bold"><strong>Returns:</strong></span> <code class="computeroutput"><span class="special">*</span><span class="keyword">this</span></code> 323 </p> 324<pre class="programlisting"><span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">IteratorTuple</span><span class="special">></span> 325<span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">IteratorTuple</span><span class="special">></span> 326<span class="identifier">make_zip_iterator</span><span class="special">(</span><span class="identifier">IteratorTuple</span> <span class="identifier">t</span><span class="special">);</span> 327</pre> 328<p> 329 <span class="bold"><strong>Returns:</strong></span> An instance of <code class="computeroutput"><span class="identifier">zip_iterator</span><span class="special"><</span><span class="identifier">IteratorTuple</span><span class="special">></span></code> 330 with <code class="computeroutput"><span class="identifier">m_iterator_tuple</span></code> initialized 331 to <code class="computeroutput"><span class="identifier">t</span></code>. 332 </p> 333</div> 334</div> 335<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 336<td align="left"></td> 337<td align="right"><div class="copyright-footer">Copyright © 2003, 2005 David Abrahams Jeremy Siek Thomas 338 Witt<p> 339 Distributed under the Boost Software License, Version 1.0. (See accompanying 340 file LICENSE_1_0.txt or copy at <ulink url="http://www.boost.org/LICENSE_1_0.txt"> 341 http://www.boost.org/LICENSE_1_0.txt </ulink>) 342 </p> 343</div></td> 344</tr></table> 345<hr> 346<div class="spirit-nav"> 347<a accesskey="p" href="transform.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../specialized.html"><img src="../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../index.html"><img src="../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="../utilities.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a> 348</div> 349</body> 350</html> 351