• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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>Intrusive avl tree based associative containers: avl_set, avl_multiset and avltree</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="map_multimap.html" title="Map and multimap-like interface for associative containers">
11<link rel="next" href="splay_set_multiset.html" title="Intrusive splay tree based associative containers: splay_set, splay_multiset and , splay_tree">
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="map_multimap.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="splay_set_multiset.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.avl_set_multiset"></a><a class="link" href="avl_set_multiset.html" title="Intrusive avl tree based associative containers: avl_set, avl_multiset and avltree">Intrusive avl tree based associative
29    containers: avl_set, avl_multiset and avltree</a>
30</h2></div></div></div>
31<div class="toc"><dl class="toc">
32<dt><span class="section"><a href="avl_set_multiset.html#intrusive.avl_set_multiset.avl_set_multiset_hooks">avl_set,
33      avl_multiset and avltree hooks</a></span></dt>
34<dt><span class="section"><a href="avl_set_multiset.html#intrusive.avl_set_multiset.set_multiset_containers">avl_set,
35      avl_multiset and avltree containers</a></span></dt>
36<dt><span class="section"><a href="avl_set_multiset.html#intrusive.avl_set_multiset.avl_set_multiset_example">Example</a></span></dt>
37</dl></div>
38<p>
39      Similar to red-black trees, AVL trees are balanced binary trees. AVL trees
40      are often compared with red-black trees because they support the same set of
41      operations and because both take O(log n) time for basic operations. AVL trees
42      are more rigidly balanced than Red-Black trees, leading to slower insertion
43      and removal but faster retrieval, so AVL trees perform better than red-black
44      trees for lookup-intensive applications.
45    </p>
46<p>
47      <span class="bold"><strong>Boost.Intrusive</strong></span> offers 3 containers based
48      on avl trees: <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set.html" title="Class template avl_set">avl_set</a></code>,
49      <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_multiset.html" title="Class template avl_multiset">avl_multiset</a></code> and
50      <code class="computeroutput"><a class="link" href="../boost/intrusive/avltree.html" title="Class template avltree">avltree</a></code>. The first two
51      are similar to <code class="computeroutput"><a class="link" href="../boost/intrusive/set.html" title="Class template set">set</a></code> or <code class="computeroutput"><a class="link" href="../boost/intrusive/multiset.html" title="Class template multiset">multiset</a></code> and the latter is a generalization
52      that offers functions both to insert unique and multiple keys.
53    </p>
54<p>
55      The memory overhead of these containers with Boost.Intrusive hooks is usually
56      3 pointers and 2 bits (due to alignment, this usually means 3 pointers plus
57      an integer). This size can be reduced to 3 pointers if pointers have 4 byte
58      alignment (which is usually true in 32 bit systems).
59    </p>
60<p>
61      An empty, non constant-time size <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set.html" title="Class template avl_set">avl_set</a></code>,
62      <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_multiset.html" title="Class template avl_multiset">avl_multiset</a></code> or
63      <code class="computeroutput"><a class="link" href="../boost/intrusive/avltree.html" title="Class template avltree">avltree</a></code> also has a size
64      of 3 pointers and an integer (3 pointers when optimized for size).
65    </p>
66<div class="section">
67<div class="titlepage"><div><div><h3 class="title">
68<a name="intrusive.avl_set_multiset.avl_set_multiset_hooks"></a><a class="link" href="avl_set_multiset.html#intrusive.avl_set_multiset.avl_set_multiset_hooks" title="avl_set, avl_multiset and avltree hooks">avl_set,
69      avl_multiset and avltree hooks</a>
70</h3></div></div></div>
71<p>
72        <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set.html" title="Class template avl_set">avl_set</a></code>, <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_multiset.html" title="Class template avl_multiset">avl_multiset</a></code> and <code class="computeroutput"><a class="link" href="../boost/intrusive/avltree.html" title="Class template avltree">avltree</a></code> share the same hooks.
73      </p>
74<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span><span class="identifier">Options</span><span class="special">&gt;</span>
75<span class="keyword">class</span> <span class="identifier">avl_set_base_hook</span><span class="special">;</span>
76</pre>
77<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
78            <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set_base_hook.html" title="Class template avl_set_base_hook">avl_set_base_hook</a></code>:
79            the user class derives publicly from this class to make it compatible
80            with avl tree based containers.
81          </li></ul></div>
82<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="special">...</span><span class="identifier">Options</span><span class="special">&gt;</span>
83<span class="keyword">class</span> <span class="identifier">avl_set_member_hook</span><span class="special">;</span>
84</pre>
85<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "><li class="listitem">
86            <code class="computeroutput"><a class="link" href="../boost/intrusive/set_member_hook.html" title="Class template set_member_hook">set_member_hook</a></code>:
87            the user class contains a public member of this class to make it compatible
88            with avl tree based containers.
89          </li></ul></div>
90<p>
91        <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set_base_hook.html" title="Class template avl_set_base_hook">avl_set_base_hook</a></code>
92        and <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set_member_hook.html" title="Class template avl_set_member_hook">avl_set_member_hook</a></code>
93        receive the same options explained in the section <a class="link" href="usage.html" title="How to use Boost.Intrusive">How
94        to use Boost.Intrusive</a> plus an option to optimize the size of the
95        node:
96      </p>
97<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
98<li class="listitem">
99            <span class="bold"><strong><code class="computeroutput"><span class="identifier">tag</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Tag</span><span class="special">&gt;</span></code></strong></span>
100            (for base hooks only): This argument serves as a tag, so you can derive
101            from more than one base hook. Default: <code class="computeroutput"><span class="identifier">tag</span><span class="special">&lt;</span><span class="identifier">default_tag</span><span class="special">&gt;</span></code>.
102          </li>
103<li class="listitem">
104            <span class="bold"><strong><code class="computeroutput"><span class="identifier">link_mode</span><span class="special">&lt;</span><span class="identifier">link_mode_type</span>
105            <span class="identifier">LinkMode</span><span class="special">&gt;</span></code></strong></span>:
106            The linking policy. Default: <code class="computeroutput"><span class="identifier">link_mode</span><span class="special">&lt;</span><span class="identifier">safe_link</span><span class="special">&gt;</span></code>.
107          </li>
108<li class="listitem">
109            <span class="bold"><strong><code class="computeroutput"><span class="identifier">void_pointer</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">VoidPointer</span><span class="special">&gt;</span></code></strong></span>:
110            The pointer type to be used internally in the hook and propagated to
111            the container. Default: <code class="computeroutput"><span class="identifier">void_pointer</span><span class="special">&lt;</span><span class="keyword">void</span><span class="special">*&gt;</span></code>.
112          </li>
113<li class="listitem">
114            <span class="bold"><strong><code class="computeroutput"><span class="identifier">optimize_size</span><span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">Enable</span><span class="special">&gt;</span></code></strong></span>:
115            The hook will be optimized for size instead of speed. The hook will embed
116            the balance bits of the AVL tree node in the parent pointer if pointer
117            alignment is multiple of 4. In some platforms, optimizing the size might
118            reduce speed performance a bit since masking operations will be needed
119            to access parent pointer and balance factor attributes, in other platforms
120            this option improves performance due to improved memory locality. Default:
121            <code class="computeroutput"><span class="identifier">optimize_size</span><span class="special">&lt;</span><span class="keyword">false</span><span class="special">&gt;</span></code>.
122          </li>
123</ul></div>
124</div>
125<div class="section">
126<div class="titlepage"><div><div><h3 class="title">
127<a name="intrusive.avl_set_multiset.set_multiset_containers"></a><a class="link" href="avl_set_multiset.html#intrusive.avl_set_multiset.set_multiset_containers" title="avl_set, avl_multiset and avltree containers">avl_set,
128      avl_multiset and avltree containers</a>
129</h3></div></div></div>
130<pre class="programlisting"><span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">Options</span><span class="special">&gt;</span>
131<span class="keyword">class</span> <span class="identifier">avl_set</span><span class="special">;</span>
132
133<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">Options</span><span class="special">&gt;</span>
134<span class="keyword">class</span> <span class="identifier">avl_multiset</span><span class="special">;</span>
135
136<span class="keyword">template</span> <span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="special">...</span><span class="identifier">Options</span><span class="special">&gt;</span>
137<span class="keyword">class</span> <span class="identifier">avltree</span><span class="special">;</span>
138</pre>
139<p>
140        These containers receive the same options explained in the section <a class="link" href="usage.html" title="How to use Boost.Intrusive">How to use Boost.Intrusive</a>:
141      </p>
142<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
143<li class="listitem">
144            <span class="bold"><strong><code class="computeroutput"><span class="identifier">base_hook</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Hook</span><span class="special">&gt;</span></code></strong></span>
145            / <span class="bold"><strong><code class="computeroutput"><span class="identifier">member_hook</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">T</span><span class="special">,</span> <span class="keyword">class</span> <span class="identifier">Hook</span><span class="special">,</span> <span class="identifier">Hook</span> <span class="identifier">T</span><span class="special">::*</span> <span class="identifier">PtrToMember</span><span class="special">&gt;</span></code></strong></span>
146            / <span class="bold"><strong><code class="computeroutput"><span class="identifier">value_traits</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">ValueTraits</span><span class="special">&gt;</span></code></strong></span>:
147            To specify the hook type or value traits used to configure the container.
148            (To learn about value traits go to the section <a class="link" href="value_traits.html" title="Containers with custom ValueTraits">Containers
149            with custom ValueTraits</a>.)
150          </li>
151<li class="listitem">
152            <span class="bold"><strong><code class="computeroutput"><span class="identifier">constant_time_size</span><span class="special">&lt;</span><span class="keyword">bool</span> <span class="identifier">Enabled</span><span class="special">&gt;</span></code></strong></span>:
153            To activate the constant-time <code class="computeroutput"><span class="identifier">size</span><span class="special">()</span></code> operation. Default: <code class="computeroutput"><span class="identifier">constant_time_size</span><span class="special">&lt;</span><span class="keyword">true</span><span class="special">&gt;</span></code>
154          </li>
155<li class="listitem">
156            <span class="bold"><strong><code class="computeroutput"><span class="identifier">size_type</span><span class="special">&lt;</span><span class="keyword">typename</span>
157            <span class="identifier">SizeType</span><span class="special">&gt;</span></code></strong></span>:
158            To specify the type that will be used to store the size of the container.
159            Default: <code class="computeroutput"><span class="identifier">size_type</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">&gt;</span></code>
160          </li>
161</ul></div>
162<p>
163        And they also can receive an additional option:
164      </p>
165<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
166<li class="listitem">
167            <span class="bold"><strong><code class="computeroutput"><span class="identifier">compare</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">Compare</span><span class="special">&gt;</span></code></strong></span>:
168            Comparison function for the objects to be inserted in containers. The
169            comparison functor must induce a strict weak ordering. Default: <code class="computeroutput"><span class="identifier">compare</span><span class="special">&lt;</span>
170            <span class="identifier">std</span><span class="special">::</span><span class="identifier">less</span><span class="special">&lt;</span><span class="identifier">key_type</span><span class="special">&gt;</span>
171            <span class="special">&gt;</span></code>
172          </li>
173<li class="listitem">
174            <span class="bold"><strong><code class="computeroutput"><span class="identifier">key_of_value</span><span class="special">&lt;</span><span class="keyword">class</span> <span class="identifier">KeyOfValueFunctionObject</span><span class="special">&gt;</span></code></strong></span>:
175            A function object that will define the <code class="computeroutput"><span class="identifier">key_type</span></code>
176            of the value type to be stored. This type will allow a map-like interface.
177            See <a class="link" href="map_multimap.html" title="Map and multimap-like interface for associative containers">Map and multimap-like interface
178            with set and multiset</a> for details. Default: <code class="computeroutput"><span class="identifier">key_type</span></code>
179            is equal to <code class="computeroutput"><span class="identifier">value_type</span></code>
180            (set-like interface).
181          </li>
182</ul></div>
183</div>
184<div class="section">
185<div class="titlepage"><div><div><h3 class="title">
186<a name="intrusive.avl_set_multiset.avl_set_multiset_example"></a><a class="link" href="avl_set_multiset.html#intrusive.avl_set_multiset.avl_set_multiset_example" title="Example">Example</a>
187</h3></div></div></div>
188<p>
189        Now let's see a small example using both hooks and <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_set.html" title="Class template avl_set">avl_set</a></code>/
190        <code class="computeroutput"><a class="link" href="../boost/intrusive/avl_multiset.html" title="Class template avl_multiset">avl_multiset</a></code>
191        containers:
192      </p>
193<pre class="programlisting"><span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">intrusive</span><span class="special">/</span><span class="identifier">avl_set</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
194<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">vector</span><span class="special">&gt;</span>
195<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
196<span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">cassert</span><span class="special">&gt;</span>
197
198<span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">intrusive</span><span class="special">;</span>
199
200                  <span class="comment">//This is a base hook optimized for size</span>
201<span class="keyword">class</span> <span class="identifier">MyClass</span> <span class="special">:</span> <span class="keyword">public</span> <span class="identifier">avl_set_base_hook</span><span class="special">&lt;</span><span class="identifier">optimize_size</span><span class="special">&lt;</span><span class="keyword">true</span><span class="special">&gt;</span> <span class="special">&gt;</span>
202<span class="special">{</span>
203   <span class="keyword">int</span> <span class="identifier">int_</span><span class="special">;</span>
204
205   <span class="keyword">public</span><span class="special">:</span>
206   <span class="comment">//This is a member hook</span>
207   <span class="identifier">avl_set_member_hook</span><span class="special">&lt;&gt;</span> <span class="identifier">member_hook_</span><span class="special">;</span>
208
209   <span class="identifier">MyClass</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span>
210      <span class="special">:</span>  <span class="identifier">int_</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span>
211      <span class="special">{}</span>
212   <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&lt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">b</span><span class="special">)</span>
213      <span class="special">{</span>  <span class="keyword">return</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">int_</span> <span class="special">&lt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">int_</span><span class="special">;</span>  <span class="special">}</span>
214   <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">&gt;</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">b</span><span class="special">)</span>
215      <span class="special">{</span>  <span class="keyword">return</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">int_</span> <span class="special">&gt;</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">int_</span><span class="special">;</span>  <span class="special">}</span>
216   <span class="keyword">friend</span> <span class="keyword">bool</span> <span class="keyword">operator</span><span class="special">==</span> <span class="special">(</span><span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">a</span><span class="special">,</span> <span class="keyword">const</span> <span class="identifier">MyClass</span> <span class="special">&amp;</span><span class="identifier">b</span><span class="special">)</span>
217      <span class="special">{</span>  <span class="keyword">return</span> <span class="identifier">a</span><span class="special">.</span><span class="identifier">int_</span> <span class="special">==</span> <span class="identifier">b</span><span class="special">.</span><span class="identifier">int_</span><span class="special">;</span>  <span class="special">}</span>
218<span class="special">};</span>
219
220<span class="comment">//Define an avl_set using the base hook that will store values in reverse order</span>
221<span class="keyword">typedef</span> <span class="identifier">avl_set</span><span class="special">&lt;</span> <span class="identifier">MyClass</span><span class="special">,</span> <span class="identifier">compare</span><span class="special">&lt;</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">greater</span><span class="special">&lt;</span><span class="identifier">MyClass</span><span class="special">&gt;</span> <span class="special">&gt;</span> <span class="special">&gt;</span>     <span class="identifier">BaseSet</span><span class="special">;</span>
222
223<span class="comment">//Define an multiset using the member hook</span>
224<span class="keyword">typedef</span> <span class="identifier">member_hook</span><span class="special">&lt;</span><span class="identifier">MyClass</span><span class="special">,</span> <span class="identifier">avl_set_member_hook</span><span class="special">&lt;&gt;,</span> <span class="special">&amp;</span><span class="identifier">MyClass</span><span class="special">::</span><span class="identifier">member_hook_</span><span class="special">&gt;</span> <span class="identifier">MemberOption</span><span class="special">;</span>
225<span class="keyword">typedef</span> <span class="identifier">avl_multiset</span><span class="special">&lt;</span> <span class="identifier">MyClass</span><span class="special">,</span> <span class="identifier">MemberOption</span><span class="special">&gt;</span>   <span class="identifier">MemberMultiset</span><span class="special">;</span>
226
227<span class="keyword">int</span> <span class="identifier">main</span><span class="special">()</span>
228<span class="special">{</span>
229   <span class="keyword">typedef</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">MyClass</span><span class="special">&gt;::</span><span class="identifier">iterator</span> <span class="identifier">VectIt</span><span class="special">;</span>
230
231   <span class="comment">//Create several MyClass objects, each one with a different value</span>
232   <span class="identifier">std</span><span class="special">::</span><span class="identifier">vector</span><span class="special">&lt;</span><span class="identifier">MyClass</span><span class="special">&gt;</span> <span class="identifier">values</span><span class="special">;</span>
233   <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="number">100</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span>  <span class="identifier">values</span><span class="special">.</span><span class="identifier">push_back</span><span class="special">(</span><span class="identifier">MyClass</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
234
235   <span class="identifier">BaseSet</span> <span class="identifier">baseset</span><span class="special">;</span>
236   <span class="identifier">MemberMultiset</span> <span class="identifier">membermultiset</span><span class="special">;</span>
237
238   <span class="comment">//Check that size optimization is activated in the base hook</span>
239   <span class="identifier">assert</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">avl_set_base_hook</span><span class="special">&lt;</span><span class="identifier">optimize_size</span><span class="special">&lt;</span><span class="keyword">true</span><span class="special">&gt;</span> <span class="special">&gt;)</span> <span class="special">==</span> <span class="number">3</span><span class="special">*</span><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">void</span><span class="special">*));</span>
240   <span class="comment">//Check that size optimization is deactivated in the member hook</span>
241   <span class="identifier">assert</span><span class="special">(</span><span class="keyword">sizeof</span><span class="special">(</span><span class="identifier">avl_set_member_hook</span><span class="special">&lt;&gt;)</span> <span class="special">&gt;</span> <span class="number">3</span><span class="special">*</span><span class="keyword">sizeof</span><span class="special">(</span><span class="keyword">void</span><span class="special">*));</span>
242
243   <span class="comment">//Now insert them in the sets</span>
244   <span class="keyword">for</span><span class="special">(</span><span class="identifier">VectIt</span> <span class="identifier">it</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()),</span> <span class="identifier">itend</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">itend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">it</span><span class="special">){</span>
245      <span class="identifier">baseset</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(*</span><span class="identifier">it</span><span class="special">);</span>
246      <span class="identifier">membermultiset</span><span class="special">.</span><span class="identifier">insert</span><span class="special">(*</span><span class="identifier">it</span><span class="special">);</span>
247   <span class="special">}</span>
248
249   <span class="comment">//Now test avl_sets</span>
250   <span class="special">{</span>
251      <span class="identifier">BaseSet</span><span class="special">::</span><span class="identifier">reverse_iterator</span> <span class="identifier">rbit</span><span class="special">(</span><span class="identifier">baseset</span><span class="special">.</span><span class="identifier">rbegin</span><span class="special">());</span>
252      <span class="identifier">MemberMultiset</span><span class="special">::</span><span class="identifier">iterator</span> <span class="identifier">mit</span><span class="special">(</span><span class="identifier">membermultiset</span><span class="special">.</span><span class="identifier">begin</span><span class="special">());</span>
253      <span class="identifier">VectIt</span> <span class="identifier">it</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">()),</span> <span class="identifier">itend</span><span class="special">(</span><span class="identifier">values</span><span class="special">.</span><span class="identifier">end</span><span class="special">());</span>
254
255      <span class="comment">//Test the objects inserted in the base hook avl_set</span>
256      <span class="keyword">for</span><span class="special">(;</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">itend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">it</span><span class="special">,</span> <span class="special">++</span><span class="identifier">rbit</span><span class="special">)</span>
257         <span class="keyword">if</span><span class="special">(&amp;*</span><span class="identifier">rbit</span> <span class="special">!=</span> <span class="special">&amp;*</span><span class="identifier">it</span><span class="special">)</span>   <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
258
259      <span class="comment">//Test the objects inserted in the member hook avl_set</span>
260      <span class="keyword">for</span><span class="special">(</span><span class="identifier">it</span> <span class="special">=</span> <span class="identifier">values</span><span class="special">.</span><span class="identifier">begin</span><span class="special">();</span> <span class="identifier">it</span> <span class="special">!=</span> <span class="identifier">itend</span><span class="special">;</span> <span class="special">++</span><span class="identifier">it</span><span class="special">,</span> <span class="special">++</span><span class="identifier">mit</span><span class="special">)</span>
261         <span class="keyword">if</span><span class="special">(&amp;*</span><span class="identifier">mit</span> <span class="special">!=</span> <span class="special">&amp;*</span><span class="identifier">it</span><span class="special">)</span> <span class="keyword">return</span> <span class="number">1</span><span class="special">;</span>
262   <span class="special">}</span>
263   <span class="keyword">return</span> <span class="number">0</span><span class="special">;</span>
264<span class="special">}</span>
265</pre>
266</div>
267</div>
268<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
269<td align="left"></td>
270<td align="right"><div class="copyright-footer">Copyright © 2005 Olaf Krzikalla<br>Copyright © 2006-2015 Ion Gaztanaga<p>
271        Distributed under the Boost Software License, Version 1.0. (See accompanying
272        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>)
273      </p>
274</div></td>
275</tr></table>
276<hr>
277<div class="spirit-nav">
278<a accesskey="p" href="map_multimap.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="splay_set_multiset.html"><img src="../../../doc/src/images/next.png" alt="Next"></a>
279</div>
280</body>
281</html>
282