1<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 2<html> 3<head> 4<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 5<title>Examples</title> 6<link rel="stylesheet" href="../../../doc/src/boostbook.css" type="text/css"> 7<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 8<link rel="home" href="../index.html" title="The Boost C++ Libraries BoostBook Documentation Subset"> 9<link rel="up" href="../stl_interfaces.html" title="Chapter 38. Boost.STLInterfaces"> 10<link rel="prev" href="tutorial___reverse_iterator_.html" title="Tutorial: reverse_iterator"> 11<link rel="next" href="../stl_interfaces/compiler_support.html" title="Compiler Support"> 12</head> 13<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF"> 14<table cellpadding="2" width="100%"><tr> 15<td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../boost.png"></td> 16<td align="center"><a href="../../../index.html">Home</a></td> 17<td align="center"><a href="../../../libs/libraries.htm">Libraries</a></td> 18<td align="center"><a href="http://www.boost.org/users/people.html">People</a></td> 19<td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td> 20<td align="center"><a href="../../../more/index.htm">More</a></td> 21</tr></table> 22<hr> 23<div class="spirit-nav"> 24<a accesskey="p" href="tutorial___reverse_iterator_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl_interfaces.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="../stl_interfaces/compiler_support.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 25</div> 26<div class="section"> 27<div class="titlepage"><div><div><h2 class="title" style="clear: both"> 28<a name="boost_stlinterfaces.examples"></a><a class="link" href="examples.html" title="Examples">Examples</a> 29</h2></div></div></div> 30<div class="toc"><dl class="toc"> 31<dt><span class="section"><a href="examples.html#boost_stlinterfaces.examples.random_access_iterator">Random 32 Access Iterator</a></span></dt> 33<dt><span class="section"><a href="examples.html#boost_stlinterfaces.examples.mutable_and_constant_iterator_interoperability">Mutable 34 and Constant Iterator Interoperability</a></span></dt> 35<dt><span class="section"><a href="examples.html#boost_stlinterfaces.examples.zip_iterator___proxy_iterator">Zip 36 Iterator / Proxy Iterator</a></span></dt> 37<dt><span class="section"><a href="examples.html#boost_stlinterfaces.examples.reimplementing__back_insert_iterator_">Reimplementing 38 <code class="computeroutput"><span class="identifier">back_insert_iterator</span></code></a></span></dt> 39<dt><span class="section"><a href="examples.html#boost_stlinterfaces.examples.reimplementing__reverse_iterator_">Reimplementing 40 <code class="computeroutput"><span class="identifier">reverse_iterator</span></code></a></span></dt> 41</dl></div> 42<div class="section"> 43<div class="titlepage"><div><div><h3 class="title"> 44<a name="boost_stlinterfaces.examples.random_access_iterator"></a><a class="link" href="examples.html#boost_stlinterfaces.examples.random_access_iterator" title="Random Access Iterator">Random 45 Access Iterator</a> 46</h3></div></div></div> 47<p> 48</p> 49<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stl_interfaces</span><span class="special">/</span><span class="identifier">iterator_interface</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 50 51<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 52<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">array</span><span class="special">></span> 53 54<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 55 56 57<span class="comment">// This is a minimal random access iterator. It uses default template</span> 58<span class="comment">// parameters for most stl_interfaces template parameters.</span> 59<span class="keyword">struct</span> <span class="identifier">simple_random_access_iterator</span> 60 <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 61 <span class="identifier">simple_random_access_iterator</span><span class="special">,</span> 62 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">,</span> 63 <span class="keyword">int</span><span class="special">></span> 64<span class="special">{</span> 65 <span class="comment">// This default constructor does not initialize it_, since that's how int *</span> 66 <span class="comment">// works as well. This allows optimum performance in code paths where</span> 67 <span class="comment">// initializing a single pointer may be measurable. It is also a</span> 68 <span class="comment">// reasonable choice to initialize with nullptr.</span> 69 <span class="identifier">simple_random_access_iterator</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">{}</span> 70 <span class="identifier">simple_random_access_iterator</span><span class="special">(</span><span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> <span class="identifier">it_</span><span class="special">(</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{}</span> 71 72 <span class="keyword">int</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">it_</span><span class="special">;</span> <span class="special">}</span> 73 <span class="identifier">simple_random_access_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span> <span class="identifier">i</span><span class="special">)</span> <span class="keyword">noexcept</span> 74 <span class="special">{</span> 75 <span class="identifier">it_</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> 76 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 77 <span class="special">}</span> 78 <span class="keyword">auto</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">simple_random_access_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 79 <span class="special">{</span> 80 <span class="keyword">return</span> <span class="identifier">it_</span> <span class="special">-</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">it_</span><span class="special">;</span> 81 <span class="special">}</span> 82 83<span class="keyword">private</span><span class="special">:</span> 84 <span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it_</span><span class="special">;</span> 85<span class="special">};</span> 86 87 88<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 89<span class="special">{</span> 90 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></span> <span class="identifier">ints</span> <span class="special">=</span> <span class="special">{{</span><span class="number">0</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">}};</span> 91 92 <span class="identifier">simple_random_access_iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">());</span> 93 <span class="identifier">simple_random_access_iterator</span> <span class="identifier">last</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 94 <span class="identifier">std</span><span class="special">::</span><span class="identifier">sort</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 95 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ints</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">>{{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">}}));</span> 96<span class="special">}</span> 97</pre> 98<p> 99 </p> 100</div> 101<div class="section"> 102<div class="titlepage"><div><div><h3 class="title"> 103<a name="boost_stlinterfaces.examples.mutable_and_constant_iterator_interoperability"></a><a class="link" href="examples.html#boost_stlinterfaces.examples.mutable_and_constant_iterator_interoperability" title="Mutable and Constant Iterator Interoperability">Mutable 104 and Constant Iterator Interoperability</a> 105</h3></div></div></div> 106<p> 107</p> 108<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stl_interfaces</span><span class="special">/</span><span class="identifier">iterator_interface</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 109 110<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 111<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">array</span><span class="special">></span> 112<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">numeric</span><span class="special">></span> 113 114<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 115 116 117<span class="comment">// This is a random access iterator templated on a value type. The ValueType</span> 118<span class="comment">// template parameter allows us easily to define const and non-const iterators</span> 119<span class="comment">// from the same template.</span> 120<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType</span><span class="special">></span> 121<span class="keyword">struct</span> <span class="identifier">random_access_iterator</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 122 <span class="identifier">random_access_iterator</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>,</span> 123 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">,</span> 124 <span class="identifier">ValueType</span><span class="special">></span> 125<span class="special">{</span> 126 <span class="keyword">static_assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">is_object</span><span class="special"><</span><span class="identifier">ValueType</span><span class="special">>::</span><span class="identifier">value</span><span class="special">,</span> <span class="string">""</span><span class="special">);</span> 127 128 <span class="comment">// Default constructor.</span> 129 <span class="keyword">constexpr</span> <span class="identifier">random_access_iterator</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">{}</span> 130 131 <span class="comment">// Construction from an underlying pointer.</span> 132 <span class="keyword">constexpr</span> <span class="identifier">random_access_iterator</span><span class="special">(</span><span class="identifier">ValueType</span> <span class="special">*</span> <span class="identifier">it</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> <span class="identifier">it_</span><span class="special">(</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{}</span> 133 134 <span class="comment">// Implicit conversion from an existing random_access_iterator with a</span> 135 <span class="comment">// possibly different value type. The enable_if logic here just enforces</span> 136 <span class="comment">// that this constructor only participates in overload resolution when the</span> 137 <span class="comment">// expression it_ = other.it_ is well-formed.</span> 138 <span class="keyword">template</span><span class="special"><</span> 139 <span class="keyword">typename</span> <span class="identifier">ValueType2</span><span class="special">,</span> 140 <span class="keyword">typename</span> <span class="identifier">E</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">enable_if_t</span><span class="special"><</span> 141 <span class="identifier">std</span><span class="special">::</span><span class="identifier">is_convertible</span><span class="special"><</span><span class="identifier">ValueType2</span> <span class="special">*,</span> <span class="identifier">ValueType</span> <span class="special">*>::</span><span class="identifier">value</span><span class="special">>></span> 142 <span class="keyword">constexpr</span> <span class="identifier">random_access_iterator</span><span class="special">(</span> 143 <span class="identifier">random_access_iterator</span><span class="special"><</span><span class="identifier">ValueType2</span><span class="special">></span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> 144 <span class="identifier">it_</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">it_</span><span class="special">)</span> 145 <span class="special">{}</span> 146 147 <span class="keyword">constexpr</span> <span class="identifier">ValueType</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">it_</span><span class="special">;</span> <span class="special">}</span> 148 <span class="keyword">constexpr</span> <span class="identifier">random_access_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span> <span class="identifier">i</span><span class="special">)</span> <span class="keyword">noexcept</span> 149 <span class="special">{</span> 150 <span class="identifier">it_</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> 151 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 152 <span class="special">}</span> 153 <span class="keyword">constexpr</span> <span class="keyword">auto</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">random_access_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 154 <span class="special">{</span> 155 <span class="keyword">return</span> <span class="identifier">it_</span> <span class="special">-</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">it_</span><span class="special">;</span> 156 <span class="special">}</span> 157 158<span class="keyword">private</span><span class="special">:</span> 159 <span class="identifier">ValueType</span> <span class="special">*</span> <span class="identifier">it_</span><span class="special">;</span> 160 161 <span class="comment">// This friendship is necessary to enable the implicit conversion</span> 162 <span class="comment">// constructor above to work.</span> 163 <span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">ValueType2</span><span class="special">></span> 164 <span class="keyword">friend</span> <span class="keyword">struct</span> <span class="identifier">random_access_iterator</span><span class="special">;</span> 165<span class="special">};</span> 166 167<span class="keyword">using</span> <span class="identifier">iterator</span> <span class="special">=</span> <span class="identifier">random_access_iterator</span><span class="special"><</span><span class="keyword">int</span><span class="special">>;</span> 168<span class="keyword">using</span> <span class="identifier">const_iterator</span> <span class="special">=</span> <span class="identifier">random_access_iterator</span><span class="special"><</span><span class="keyword">int</span> <span class="keyword">const</span><span class="special">>;</span> 169 170<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 171<span class="special">{</span> 172 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></span> <span class="identifier">ints</span> <span class="special">=</span> <span class="special">{{</span><span class="number">0</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">}};</span> 173 174 <span class="comment">// Create and use two mutable iterators.</span> 175 <span class="identifier">iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">());</span> 176 <span class="identifier">iterator</span> <span class="identifier">last</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 177 <span class="identifier">std</span><span class="special">::</span><span class="identifier">sort</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 178 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ints</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">>{{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">}}));</span> 179 180 <span class="comment">// Create and use two constant iterators, one from an existing mutable</span> 181 <span class="comment">// iterator.</span> 182 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></span> <span class="identifier">int_sums</span><span class="special">;</span> 183 <span class="identifier">const_iterator</span> <span class="identifier">cfirst</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">());</span> 184 <span class="identifier">const_iterator</span> <span class="identifier">clast</span> <span class="special">=</span> <span class="identifier">last</span><span class="special">;</span> 185 <span class="identifier">std</span><span class="special">::</span><span class="identifier">partial_sum</span><span class="special">(</span><span class="identifier">cfirst</span><span class="special">,</span> <span class="identifier">clast</span><span class="special">,</span> <span class="identifier">int_sums</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span> 186 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">int_sums</span> <span class="special">==</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">>{{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">10</span><span class="special">,</span> <span class="number">15</span><span class="special">,</span> <span class="number">21</span><span class="special">,</span> <span class="number">28</span><span class="special">,</span> <span class="number">36</span><span class="special">,</span> <span class="number">45</span><span class="special">}}));</span> 187<span class="special">}</span> 188</pre> 189<p> 190 </p> 191</div> 192<div class="section"> 193<div class="titlepage"><div><div><h3 class="title"> 194<a name="boost_stlinterfaces.examples.zip_iterator___proxy_iterator"></a><a class="link" href="examples.html#boost_stlinterfaces.examples.zip_iterator___proxy_iterator" title="Zip Iterator / Proxy Iterator">Zip 195 Iterator / Proxy Iterator</a> 196</h3></div></div></div> 197<p> 198</p> 199<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stl_interfaces</span><span class="special">/</span><span class="identifier">iterator_interface</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 200 201<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 202<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">array</span><span class="special">></span> 203<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">tuple</span><span class="special">></span> 204 205<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 206 207 208<span class="comment">// This is a zip iterator, meaning that it iterates over a notional sequence</span> 209<span class="comment">// of pairs that is formed from two actual sequences of scalars. To make this</span> 210<span class="comment">// iterator writable, it needs to have a reference type that is not actually a</span> 211<span class="comment">// reference -- the reference type is a pair of references, std::tuple<int &,</span> 212<span class="comment">// int &>.</span> 213<span class="keyword">struct</span> <span class="identifier">zip_iterator</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">proxy_iterator_interface</span><span class="special"><</span> 214 <span class="identifier">zip_iterator</span><span class="special">,</span> 215 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_access_iterator_tag</span><span class="special">,</span> 216 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>,</span> 217 <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span> <span class="special">&,</span> <span class="keyword">int</span> <span class="special">&>></span> 218<span class="special">{</span> 219 <span class="keyword">constexpr</span> <span class="identifier">zip_iterator</span><span class="special">()</span> <span class="keyword">noexcept</span> <span class="special">:</span> <span class="identifier">it1_</span><span class="special">(),</span> <span class="identifier">it2_</span><span class="special">()</span> <span class="special">{}</span> 220 <span class="keyword">constexpr</span> <span class="identifier">zip_iterator</span><span class="special">(</span><span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it1</span><span class="special">,</span> <span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it2</span><span class="special">)</span> <span class="keyword">noexcept</span> <span class="special">:</span> <span class="identifier">it1_</span><span class="special">(</span><span class="identifier">it1</span><span class="special">),</span> <span class="identifier">it2_</span><span class="special">(</span><span class="identifier">it2</span><span class="special">)</span> 221 <span class="special">{}</span> 222 223 <span class="keyword">constexpr</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span> <span class="special">&,</span> <span class="keyword">int</span> <span class="special">&></span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 224 <span class="special">{</span> 225 <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span> <span class="special">&,</span> <span class="keyword">int</span> <span class="special">&>{*</span><span class="identifier">it1_</span><span class="special">,</span> <span class="special">*</span><span class="identifier">it2_</span><span class="special">};</span> 226 <span class="special">}</span> 227 <span class="keyword">constexpr</span> <span class="identifier">zip_iterator</span> <span class="special">&</span> <span class="keyword">operator</span> <span class="special">+=</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">ptrdiff_t</span> <span class="identifier">i</span><span class="special">)</span> <span class="keyword">noexcept</span> 228 <span class="special">{</span> 229 <span class="identifier">it1_</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> 230 <span class="identifier">it2_</span> <span class="special">+=</span> <span class="identifier">i</span><span class="special">;</span> 231 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 232 <span class="special">}</span> 233 <span class="keyword">constexpr</span> <span class="keyword">auto</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">zip_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="keyword">noexcept</span> 234 <span class="special">{</span> 235 <span class="keyword">return</span> <span class="identifier">it1_</span> <span class="special">-</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">it1_</span><span class="special">;</span> 236 <span class="special">}</span> 237 238<span class="keyword">private</span><span class="special">:</span> 239 <span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it1_</span><span class="special">;</span> 240 <span class="keyword">int</span> <span class="special">*</span> <span class="identifier">it2_</span><span class="special">;</span> 241<span class="special">};</span> 242 243 244<span class="keyword">namespace</span> <span class="identifier">std</span> <span class="special">{</span> 245 <span class="comment">// Required for std::sort to work with zip_iterator. Without this</span> 246 <span class="comment">// overload, std::sort eventually tries to call std::swap(*it1, *it2),</span> 247 <span class="comment">// *it1 and *it2 are rvalues, and std::swap() takes mutable lvalue</span> 248 <span class="comment">// references. That makes std::swap(*it1, *it2) ill-formed.</span> 249 <span class="comment">//</span> 250 <span class="comment">// Note that this overload does not conflict with any other swap()</span> 251 <span class="comment">// overloads, since this one takes rvalue reference parameters.</span> 252 <span class="comment">//</span> 253 <span class="comment">// Also note that this overload has to be in namespace std only because</span> 254 <span class="comment">// ADL cannot find it anywhere else. If</span> 255 <span class="comment">// zip_iterator::reference/std::tuple's template parameters were not</span> 256 <span class="comment">// builtins, this overload could be in whatever namespace those template</span> 257 <span class="comment">// parameters were declared in.</span> 258 <span class="keyword">void</span> <span class="identifier">swap</span><span class="special">(</span><span class="identifier">zip_iterator</span><span class="special">::</span><span class="identifier">reference</span> <span class="special">&&</span> <span class="identifier">lhs</span><span class="special">,</span> <span class="identifier">zip_iterator</span><span class="special">::</span><span class="identifier">reference</span> <span class="special">&&</span> <span class="identifier">rhs</span><span class="special">)</span> 259 <span class="special">{</span> 260 <span class="keyword">using</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span><span class="special">;</span> 261 <span class="identifier">swap</span><span class="special">(</span><span class="identifier">std</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="identifier">lhs</span><span class="special">),</span> <span class="identifier">std</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="identifier">rhs</span><span class="special">));</span> 262 <span class="identifier">swap</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="number">1</span><span class="special">>(</span><span class="identifier">lhs</span><span class="special">),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">get</span><span class="special"><</span><span class="number">1</span><span class="special">>(</span><span class="identifier">rhs</span><span class="special">));</span> 263 <span class="special">}</span> 264<span class="special">}</span> 265 266 267<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 268<span class="special">{</span> 269 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></span> <span class="identifier">ints</span> <span class="special">=</span> <span class="special">{{</span><span class="number">2</span><span class="special">,</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">9</span><span class="special">,</span> <span class="number">7</span><span class="special">}};</span> 270 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="number">10</span><span class="special">></span> <span class="identifier">ones</span> <span class="special">=</span> <span class="special">{{</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">}};</span> 271 272 <span class="special">{</span> 273 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>,</span> <span class="number">10</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">{{</span> 274 <span class="special">{</span><span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 275 <span class="special">{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 276 <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 277 <span class="special">{</span><span class="number">5</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 278 <span class="special">{</span><span class="number">3</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 279 <span class="special">{</span><span class="number">6</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 280 <span class="special">{</span><span class="number">8</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 281 <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 282 <span class="special">{</span><span class="number">9</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 283 <span class="special">{</span><span class="number">7</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 284 <span class="special">}};</span> 285 286 <span class="identifier">zip_iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">data</span><span class="special">());</span> 287 <span class="identifier">zip_iterator</span> <span class="identifier">last</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 288 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">()));</span> 289 <span class="special">}</span> 290 291 <span class="special">{</span> 292 <span class="identifier">std</span><span class="special">::</span><span class="identifier">array</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special"><</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">>,</span> <span class="number">10</span><span class="special">></span> <span class="keyword">const</span> <span class="identifier">result</span> <span class="special">=</span> <span class="special">{{</span> 293 <span class="special">{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 294 <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 295 <span class="special">{</span><span class="number">2</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 296 <span class="special">{</span><span class="number">3</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 297 <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 298 <span class="special">{</span><span class="number">5</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 299 <span class="special">{</span><span class="number">6</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 300 <span class="special">{</span><span class="number">7</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 301 <span class="special">{</span><span class="number">8</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 302 <span class="special">{</span><span class="number">9</span><span class="special">,</span> <span class="number">1</span><span class="special">},</span> 303 <span class="special">}};</span> 304 <span class="identifier">zip_iterator</span> <span class="identifier">first</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">(),</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">data</span><span class="special">());</span> 305 <span class="identifier">zip_iterator</span> <span class="identifier">last</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">(),</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">data</span><span class="special">()</span> <span class="special">+</span> <span class="identifier">ones</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 306 <span class="identifier">assert</span><span class="special">(!</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">()));</span> 307 <span class="identifier">std</span><span class="special">::</span><span class="identifier">sort</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">);</span> 308 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal</span><span class="special">(</span><span class="identifier">first</span><span class="special">,</span> <span class="identifier">last</span><span class="special">,</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">result</span><span class="special">.</span><span class="identifier">end</span><span class="special">()));</span> 309 <span class="special">}</span> 310<span class="special">}</span> 311</pre> 312<p> 313 </p> 314</div> 315<div class="section"> 316<div class="titlepage"><div><div><h3 class="title"> 317<a name="boost_stlinterfaces.examples.reimplementing__back_insert_iterator_"></a><a class="link" href="examples.html#boost_stlinterfaces.examples.reimplementing__back_insert_iterator_" title="Reimplementing back_insert_iterator">Reimplementing 318 <code class="computeroutput"><span class="identifier">back_insert_iterator</span></code></a> 319</h3></div></div></div> 320<p> 321</p> 322<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stl_interfaces</span><span class="special">/</span><span class="identifier">iterator_interface</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 323 324<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 325<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 326 327<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 328 329 330<span class="comment">// This is an output iterator that holds a reference to a container, and calls</span> 331<span class="comment">// push_back() on that container when it is written to, just like</span> 332<span class="comment">// std::back_insert_iterator. This is not a lot less code to write than the</span> 333<span class="comment">// implementation of std::back_insert_iterator, but it demonstrates that</span> 334<span class="comment">// iterator_interface is flexible enough to handle this odd kind of iterator.</span> 335<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 336<span class="keyword">struct</span> <span class="identifier">back_insert_iterator</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 337 <span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>,</span> 338 <span class="identifier">std</span><span class="special">::</span><span class="identifier">output_iterator_tag</span><span class="special">,</span> 339 <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">,</span> 340 <span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="special">&></span> 341<span class="special">{</span> 342 <span class="comment">// For concept requirements.</span> 343 <span class="identifier">back_insert_iterator</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">c_</span><span class="special">(</span><span class="keyword">nullptr</span><span class="special">)</span> <span class="special">{}</span> 344 345 <span class="comment">// Construct from a container.</span> 346 <span class="keyword">explicit</span> <span class="identifier">back_insert_iterator</span><span class="special">(</span><span class="identifier">Container</span> <span class="special">&</span> <span class="identifier">c</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">c_</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">addressof</span><span class="special">(</span><span class="identifier">c</span><span class="special">))</span> <span class="special">{}</span> 347 348 <span class="comment">// When writing to *this, copy v into the container via push_back().</span> 349 <span class="identifier">back_insert_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span> <span class="keyword">const</span> <span class="special">&</span> <span class="identifier">v</span><span class="special">)</span> 350 <span class="special">{</span> 351 <span class="identifier">c_</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">v</span><span class="special">);</span> 352 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 353 <span class="special">}</span> 354 <span class="comment">// When writing to *this, move v into the container via push_back().</span> 355 <span class="identifier">back_insert_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">=(</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span> <span class="special">&&</span> <span class="identifier">v</span><span class="special">)</span> 356 <span class="special">{</span> 357 <span class="identifier">c_</span><span class="special">-></span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">move</span><span class="special">(</span><span class="identifier">v</span><span class="special">));</span> 358 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 359 <span class="special">}</span> 360 361 <span class="comment">// Dereferencing *this just returns a reference to *this, so that the</span> 362 <span class="comment">// expression *it = value uses the operator=() overloads above.</span> 363 <span class="identifier">back_insert_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span> 364 <span class="comment">// There is no underlying sequence over which we are iterating, so there's</span> 365 <span class="comment">// nowhere to go in next(). Do nothing.</span> 366 <span class="identifier">back_insert_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> <span class="special">}</span> 367 368 <span class="keyword">using</span> <span class="identifier">base_type</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 369 <span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>,</span> 370 <span class="identifier">std</span><span class="special">::</span><span class="identifier">output_iterator_tag</span><span class="special">,</span> 371 <span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">::</span><span class="identifier">value_type</span><span class="special">,</span> 372 <span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="special">&>;</span> 373 <span class="keyword">using</span> <span class="identifier">base_type</span><span class="special">::</span><span class="keyword">operator</span><span class="special">++;</span> 374 375<span class="keyword">private</span><span class="special">:</span> 376 <span class="identifier">Container</span> <span class="special">*</span> <span class="identifier">c_</span><span class="special">;</span> 377<span class="special">};</span> 378 379<span class="comment">// A convenience function that creates a back_insert_iterator<Container>.</span> 380<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">Container</span><span class="special">></span> 381<span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">></span> <span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">Container</span> <span class="special">&</span> <span class="identifier">c</span><span class="special">)</span> 382<span class="special">{</span> 383 <span class="keyword">return</span> <span class="identifier">back_insert_iterator</span><span class="special"><</span><span class="identifier">Container</span><span class="special">>(</span><span class="identifier">c</span><span class="special">);</span> 384<span class="special">}</span> 385 386 387<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 388<span class="special">{</span> 389 <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">ints</span> <span class="special">=</span> <span class="special">{{</span><span class="number">0</span><span class="special">,</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">4</span><span class="special">,</span> <span class="number">5</span><span class="special">,</span> <span class="number">6</span><span class="special">,</span> <span class="number">7</span><span class="special">,</span> <span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">}};</span> 390 <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">ints_copy</span><span class="special">;</span> 391 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">(),</span> <span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints_copy</span><span class="special">));</span> 392 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ints_copy</span> <span class="special">==</span> <span class="identifier">ints</span><span class="special">);</span> 393<span class="special">}</span> 394</pre> 395<p> 396 </p> 397</div> 398<div class="section"> 399<div class="titlepage"><div><div><h3 class="title"> 400<a name="boost_stlinterfaces.examples.reimplementing__reverse_iterator_"></a><a class="link" href="examples.html#boost_stlinterfaces.examples.reimplementing__reverse_iterator_" title="Reimplementing reverse_iterator">Reimplementing 401 <code class="computeroutput"><span class="identifier">reverse_iterator</span></code></a> 402</h3></div></div></div> 403<p> 404</p> 405<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">stl_interfaces</span><span class="special">/</span><span class="identifier">iterator_interface</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 406 407<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">algorithm</span><span class="special">></span> 408<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">list</span><span class="special">></span> 409<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">vector</span><span class="special">></span> 410 411<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cassert</span><span class="special">></span> 412 413 414<span class="comment">// In all the previous examples, we only had to implement a subset of the six</span> 415<span class="comment">// possible user-defined basis operations that was needed for one particular</span> 416<span class="comment">// iterator concept. For reverse_iterator, we want to support bidirectional,</span> 417<span class="comment">// random access, and contiguous iterators. We therefore need to provide all</span> 418<span class="comment">// the basis operations that might be needed.</span> 419<span class="keyword">template</span><span class="special"><</span><span class="keyword">typename</span> <span class="identifier">BidiIter</span><span class="special">></span> 420<span class="keyword">struct</span> <span class="identifier">reverse_iterator</span> 421 <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">iterator_interface</span><span class="special"><</span> 422 <span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>,</span> 423<span class="preprocessor">#if</span> <span class="number">201703L</span> <span class="special"><</span> <span class="identifier">__cplusplus</span> <span class="special">&&</span> <span class="identifier">defined</span><span class="special">(</span><span class="identifier">__cpp_lib_ranges</span><span class="special">)</span> 424 <span class="identifier">boost</span><span class="special">::</span><span class="identifier">stl_interfaces</span><span class="special">::</span><span class="identifier">v2</span><span class="special">::</span><span class="identifier">detail</span><span class="special">::</span><span class="identifier">iter_concept_t</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>,</span> 425<span class="preprocessor">#else</span> 426 <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>::</span><span class="identifier">iterator_category</span><span class="special">,</span> 427<span class="preprocessor">#endif</span> 428 <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>::</span><span class="identifier">value_type</span><span class="special">></span> 429<span class="special">{</span> 430 <span class="identifier">reverse_iterator</span><span class="special">()</span> <span class="special">:</span> <span class="identifier">it_</span><span class="special">()</span> <span class="special">{}</span> 431 <span class="identifier">reverse_iterator</span><span class="special">(</span><span class="identifier">BidiIter</span> <span class="identifier">it</span><span class="special">)</span> <span class="special">:</span> <span class="identifier">it_</span><span class="special">(</span><span class="identifier">it</span><span class="special">)</span> <span class="special">{}</span> 432 433 <span class="keyword">using</span> <span class="identifier">ref_t</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>::</span><span class="identifier">reference</span><span class="special">;</span> 434 <span class="keyword">using</span> <span class="identifier">diff_t</span> <span class="special">=</span> <span class="keyword">typename</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">iterator_traits</span><span class="special"><</span><span class="identifier">BidiIter</span><span class="special">>::</span><span class="identifier">difference_type</span><span class="special">;</span> 435 436 <span class="identifier">ref_t</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">*</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">prev</span><span class="special">(</span><span class="identifier">it_</span><span class="special">);</span> <span class="special">}</span> 437 438 <span class="comment">// These three are used only when BidiIter::iterator_category is</span> 439 <span class="comment">// std::bidirectional_iterator_tag.</span> 440 <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==(</span><span class="identifier">reverse_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">it_</span> <span class="special">==</span> <span class="identifier">other</span><span class="special">.</span><span class="identifier">it_</span><span class="special">;</span> <span class="special">}</span> 441 442 <span class="comment">// Even though iterator_interface-derived bidirectional iterators are</span> 443 <span class="comment">// usually given operator++() and operator--() members, it turns out that</span> 444 <span class="comment">// operator+=() below amounts to the same thing. That's good, since</span> 445 <span class="comment">// having operator++() and operator+=() in this class would have lead to</span> 446 <span class="comment">// ambiguities in iterator_interface.</span> 447 448 <span class="comment">// These two are only used when BidiIter::iterator_category is</span> 449 <span class="comment">// std::random_access_iterator_tag or std::contiguous_iterator_tag. Even</span> 450 <span class="comment">// so, they need to compile even when BidiIter::iterator_category is</span> 451 <span class="comment">// std::bidirectional_iterator_tag. That means we have to use</span> 452 <span class="comment">// std::distance() and std::advance() instead of operator-() and</span> 453 <span class="comment">// operator+=().</span> 454 <span class="comment">//</span> 455 <span class="comment">// Don't worry, the O(n) bidirectional implementations of std::distance()</span> 456 <span class="comment">// and std::advance() are dead code, because compare() and advance() are</span> 457 <span class="comment">// never even called when BidiIter::iterator_category is</span> 458 <span class="comment">// std::bidirectional_iterator_tag.</span> 459 <span class="identifier">diff_t</span> <span class="keyword">operator</span><span class="special">-(</span><span class="identifier">reverse_iterator</span> <span class="identifier">other</span><span class="special">)</span> <span class="keyword">const</span> 460 <span class="special">{</span> 461 <span class="keyword">return</span> <span class="special">-</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">distance</span><span class="special">(</span><span class="identifier">other</span><span class="special">.</span><span class="identifier">it_</span><span class="special">,</span> <span class="identifier">it_</span><span class="special">);</span> 462 <span class="special">}</span> 463 <span class="identifier">reverse_iterator</span> <span class="special">&</span> <span class="keyword">operator</span><span class="special">+=(</span><span class="identifier">diff_t</span> <span class="identifier">n</span><span class="special">)</span> 464 <span class="special">{</span> 465 <span class="identifier">std</span><span class="special">::</span><span class="identifier">advance</span><span class="special">(</span><span class="identifier">it_</span><span class="special">,</span> <span class="special">-</span><span class="identifier">n</span><span class="special">);</span> 466 <span class="keyword">return</span> <span class="special">*</span><span class="keyword">this</span><span class="special">;</span> 467 <span class="special">}</span> 468 469 <span class="comment">// No need for a using declaration to make</span> 470 <span class="comment">// iterator_interface::operator++(int) visible, because we're not defining</span> 471 <span class="comment">// operator++() in this template.</span> 472 473<span class="keyword">private</span><span class="special">:</span> 474 <span class="identifier">BidiIter</span> <span class="identifier">it_</span><span class="special">;</span> 475<span class="special">};</span> 476 477<span class="keyword">using</span> <span class="identifier">rev_bidi_iter</span> <span class="special">=</span> <span class="identifier">reverse_iterator</span><span class="special"><</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">int</span><span class="special">>::</span><span class="identifier">iterator</span><span class="special">>;</span> 478<span class="keyword">using</span> <span class="identifier">rev_ra_iter</span> <span class="special">=</span> <span class="identifier">reverse_iterator</span><span class="special"><</span><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">iterator</span><span class="special">>;</span> 479 480 481<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span> 482<span class="special">{</span> 483 <span class="special">{</span> 484 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints</span> <span class="special">=</span> <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">2</span><span class="special">};</span> 485 <span class="identifier">std</span><span class="special">::</span><span class="identifier">list</span><span class="special"><</span><span class="keyword">int</span><span class="special">></span> <span class="identifier">ints_copy</span><span class="special">;</span> 486 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> 487 <span class="identifier">rev_bidi_iter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">()),</span> 488 <span class="identifier">rev_bidi_iter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()),</span> 489 <span class="identifier">std</span><span class="special">::</span><span class="identifier">back_inserter</span><span class="special">(</span><span class="identifier">ints_copy</span><span class="special">));</span> 490 <span class="identifier">std</span><span class="special">::</span><span class="identifier">reverse</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> 491 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ints_copy</span> <span class="special">==</span> <span class="identifier">ints</span><span class="special">);</span> 492 <span class="special">}</span> 493 494 <span class="special">{</span> 495 <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">ints</span> <span class="special">=</span> <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">2</span><span class="special">};</span> 496 <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">ints_copy</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">size</span><span class="special">());</span> 497 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> 498 <span class="identifier">rev_ra_iter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">()),</span> 499 <span class="identifier">rev_ra_iter</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()),</span> 500 <span class="identifier">ints_copy</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span> 501 <span class="identifier">std</span><span class="special">::</span><span class="identifier">reverse</span><span class="special">(</span><span class="identifier">ints</span><span class="special">.</span><span class="identifier">begin</span><span class="special">(),</span> <span class="identifier">ints</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> 502 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">ints_copy</span> <span class="special">==</span> <span class="identifier">ints</span><span class="special">);</span> 503 <span class="special">}</span> 504 505 <span class="special">{</span> 506 <span class="keyword">using</span> <span class="identifier">rev_ptr_iter</span> <span class="special">=</span> <span class="identifier">reverse_iterator</span><span class="special"><</span><span class="keyword">int</span> <span class="special">*>;</span> 507 508 <span class="keyword">int</span> <span class="identifier">ints</span><span class="special">[</span><span class="number">3</span><span class="special">]</span> <span class="special">=</span> <span class="special">{</span><span class="number">4</span><span class="special">,</span> <span class="number">3</span><span class="special">,</span> <span class="number">2</span><span class="special">};</span> 509 <span class="keyword">int</span> <span class="identifier">ints_copy</span><span class="special">[</span><span class="number">3</span><span class="special">];</span> 510 <span class="identifier">std</span><span class="special">::</span><span class="identifier">copy</span><span class="special">(</span> 511 <span class="identifier">rev_ptr_iter</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">ints</span><span class="special">)),</span> 512 <span class="identifier">rev_ptr_iter</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">ints</span><span class="special">)),</span> 513 <span class="identifier">std</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">ints_copy</span><span class="special">));</span> 514 <span class="identifier">std</span><span class="special">::</span><span class="identifier">reverse</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">ints</span><span class="special">));</span> 515 <span class="identifier">assert</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">equal</span><span class="special">(</span> 516 <span class="identifier">std</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">ints_copy</span><span class="special">),</span> 517 <span class="identifier">std</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">ints_copy</span><span class="special">),</span> 518 <span class="identifier">std</span><span class="special">::</span><span class="identifier">begin</span><span class="special">(</span><span class="identifier">ints</span><span class="special">),</span> 519 <span class="identifier">std</span><span class="special">::</span><span class="identifier">end</span><span class="special">(</span><span class="identifier">ints</span><span class="special">)));</span> 520 <span class="special">}</span> 521<span class="special">}</span> 522</pre> 523<p> 524 </p> 525</div> 526</div> 527<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 528<td align="left"></td> 529<td align="right"><div class="copyright-footer">Copyright © 2019 T. Zachary Laine<p> 530 Distributed under the Boost Software License, Version 1.0. (See accompanying 531 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>) 532 </p> 533</div></td> 534</tr></table> 535<hr> 536<div class="spirit-nav"> 537<a accesskey="p" href="tutorial___reverse_iterator_.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../stl_interfaces.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="../stl_interfaces/compiler_support.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 538</div> 539</body> 540</html> 541