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>Boost.Intrusive Iterator features</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="../intrusive.html" title="Chapter 19. Boost.Intrusive"> 10<link rel="prev" href="thread_safety.html" title="Thread safety guarantees"> 11<link rel="next" href="equal_range_stability.html" title="Stability and insertion with hint in ordered associative containers with equivalent keys"> 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="thread_safety.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../intrusive.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="equal_range_stability.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="intrusive.boost_intrusive_iterators"></a><a class="link" href="boost_intrusive_iterators.html" title="Boost.Intrusive Iterator features">Boost.Intrusive Iterator 29 features</a> 30</h2></div></div></div> 31<div class="toc"><dl class="toc"> 32<dt><span class="section"><a href="boost_intrusive_iterators.html#intrusive.boost_intrusive_iterators.null_forward_iterators">Null 33 forward iterators</a></span></dt> 34<dt><span class="section"><a href="boost_intrusive_iterators.html#intrusive.boost_intrusive_iterators.scary_iterators">Scary 35 Iterators</a></span></dt> 36</dl></div> 37<div class="section"> 38<div class="titlepage"><div><div><h3 class="title"> 39<a name="intrusive.boost_intrusive_iterators.null_forward_iterators"></a><a class="link" href="boost_intrusive_iterators.html#intrusive.boost_intrusive_iterators.null_forward_iterators" title="Null forward iterators">Null 40 forward iterators</a> 41</h3></div></div></div> 42<p> 43 <span class="bold"><strong>Boost.Intrusive</strong></span> implements <a href="http://www.open-std.org/JTC1/sc22/WG21/docs/papers/2013/n3644.pdf" target="_top">C++14 44 Null Forward Iterators</a>, a feature that was introduced with C++14. 45 This means that equality and inequality comparison are defined over all iterators 46 for the same underlying sequence and the value initialized-iterators. 47 </p> 48<p> 49 Value initialized iterators behave as if they refer past the end of the same 50 empty sequence: 51 </p> 52<pre class="programlisting"><span class="identifier">list</span><span class="special"><</span><span class="identifier">MyType</span><span class="special">></span> <span class="identifier">l</span> <span class="special">=</span> <span class="special">{</span> <span class="special">...</span> <span class="special">};</span> 53<span class="keyword">auto</span> <span class="identifier">ni</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">MyType</span><span class="special">>::</span><span class="identifier">iterator</span><span class="special">();</span> 54<span class="keyword">auto</span> <span class="identifier">nd</span> <span class="special">=</span> <span class="identifier">list</span><span class="special"><</span><span class="identifier">MyType2</span><span class="special">>::</span><span class="identifier">iterator</span><span class="special">();</span> 55<span class="identifier">ni</span> <span class="special">==</span> <span class="identifier">ni</span><span class="special">;</span> <span class="comment">// True.</span> 56<span class="identifier">nd</span> <span class="special">!=</span> <span class="identifier">nd</span><span class="special">;</span> <span class="comment">// False.</span> 57<span class="identifier">ni</span> <span class="special">==</span> <span class="identifier">nd</span><span class="special">;</span> <span class="comment">// Won't compile.</span> 58</pre> 59</div> 60<div class="section"> 61<div class="titlepage"><div><div><h3 class="title"> 62<a name="intrusive.boost_intrusive_iterators.scary_iterators"></a><a class="link" href="boost_intrusive_iterators.html#intrusive.boost_intrusive_iterators.scary_iterators" title="Scary Iterators">Scary 63 Iterators</a> 64</h3></div></div></div> 65<p> 66 The paper N2913, titled <a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2913.pdf%2c" target="_top">SCARY 67 Iterator Assignment and Initialization</a>, proposed a requirement that 68 a standard container's iterator types have no dependency on any type argument 69 apart from the container's <code class="computeroutput"><span class="identifier">value_type</span></code>, 70 <code class="computeroutput"><span class="identifier">difference_type</span></code>, <code class="computeroutput"><span class="identifier">pointer</span> <span class="identifier">type</span></code>, 71 and <code class="computeroutput"><span class="identifier">const_pointer</span></code> type. In 72 particular, according to the proposal, the types of a standard container's 73 iterators should not depend on the container's <code class="computeroutput"><span class="identifier">key_compare</span></code>, 74 <code class="computeroutput"><span class="identifier">hasher</span></code>, <code class="computeroutput"><span class="identifier">key_equal</span></code>, 75 or <code class="computeroutput"><span class="identifier">allocator</span></code> types. 76 </p> 77<p> 78 That paper demonstrated that SCARY operations were crucial to the performant 79 implementation of common design patterns using STL components. It showed 80 that implementations that support SCARY operations reduce object code bloat 81 by eliminating redundant specializations of iterator and algorithm templates. 82 </p> 83<p> 84 <span class="bold"><strong>Boost.Intrusive</strong></span> containers are a bit different 85 from standard containers. In particular, they have no allocator parameter 86 and they can be configured with additional options not present in STL-like 87 containers. Thus <span class="bold"><strong>Boost.Intrusive</strong></span> offers 88 its own <code class="computeroutput"><span class="identifier">SCARY</span> <span class="identifier">iterator</span></code> 89 implementation, where iterator types don't change when the container is configured 90 with an option that does not alter the value <-> node transformation. 91 More concretely, the following options and conditions guarantee that iterator 92 types are unchanged: 93 </p> 94<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 95<li class="listitem"> 96 <span class="bold"><strong>All containers</strong></span>: <code class="computeroutput"><span class="identifier">size_type</span><span class="special"><></span></code>, <code class="computeroutput"><span class="identifier">constant_time_size</span><span class="special"><></span></code>, 97 </li> 98<li class="listitem"> 99 <span class="bold"><strong><code class="computeroutput"><span class="identifier">slist</span></code></strong></span>: 100 <code class="computeroutput"><span class="identifier">cache_last</span><span class="special"><></span></code>, 101 <code class="computeroutput"><span class="identifier">linear</span><span class="special"><></span></code>, 102 </li> 103<li class="listitem"> 104 <span class="bold"><strong><code class="computeroutput"><span class="identifier">unordered_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code></strong></span>: 105 <code class="computeroutput"><span class="identifier">hash</span><span class="special"><></span></code>, 106 <code class="computeroutput"><span class="identifier">equal</span><span class="special"><></span></code>, 107 <code class="computeroutput"><span class="identifier">power_2_buckets</span><span class="special"><></span></code>, 108 <code class="computeroutput"><span class="identifier">cache_begin</span><span class="special"><></span></code>. 109 </li> 110<li class="listitem"> 111 <span class="bold"><strong>All tree-like containers</strong></span> (<code class="computeroutput"><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, 112 <code class="computeroutput"><span class="identifier">avl_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, <code class="computeroutput"><span class="identifier">sg_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, 113 <code class="computeroutput"><span class="identifier">bs_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, <code class="computeroutput"><span class="identifier">splay_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, 114 <code class="computeroutput"><span class="identifier">treap_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>): <code class="computeroutput"><span class="identifier">compare</span><span class="special"><></span></code>. 115 </li> 116<li class="listitem"> 117 <span class="bold"><strong><code class="computeroutput"><span class="identifier">treap_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code></strong></span>: 118 <code class="computeroutput"><span class="identifier">priority</span><span class="special"><></span></code> 119 </li> 120<li class="listitem"> 121 <span class="bold"><strong><code class="computeroutput"><span class="identifier">bs_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, 122 <code class="computeroutput"><span class="identifier">sg_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, <code class="computeroutput"><span class="identifier">treap_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code>, 123 <code class="computeroutput"><span class="identifier">splay_</span><span class="special">[</span><span class="identifier">multi</span><span class="special">]</span><span class="identifier">set</span></code></strong></span>: They share the same 124 iterator type when configured with the same options. 125 </li> 126</ul></div> 127</div> 128</div> 129<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 130<td align="left"></td> 131<td align="right"><div class="copyright-footer">Copyright © 2005 Olaf Krzikalla<br>Copyright © 2006-2015 Ion Gaztanaga<p> 132 Distributed under the Boost Software License, Version 1.0. (See accompanying 133 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>) 134 </p> 135</div></td> 136</tr></table> 137<hr> 138<div class="spirit-nav"> 139<a accesskey="p" href="thread_safety.html"><img src="../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../intrusive.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="equal_range_stability.html"><img src="../../../doc/src/images/next.png" alt="Next"></a> 140</div> 141</body> 142</html> 143