]> git.ipfire.org Git - thirdparty/gcc.git/blame - libstdc++-v3/docs/html/ext/pb_assoc/tree_based_containers.html
* typeck.c (build_modify_expr): Tidy diagnostic message.
[thirdparty/gcc.git] / libstdc++-v3 / docs / html / ext / pb_assoc / tree_based_containers.html
CommitLineData
fd1e1726
BK
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
2<html>
3 <head>
4 <title>Tree-Based Containers</title>
5 <meta name="GENERATOR" content="Microsoft Visual Studio .NET 7.1">
6 <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
7 </head>
8<body bgcolor = "white">
9<h1>Tree-Based Containers</h1>
10
11<p>
12 This section describes tree-based containers. It is organized as follows.
13</p>
14
15<ol>
16 <li> <a href = "#overview">Overview</a> describes an overview.</li>
17 <li> <a href = "#invariants">Node Invariants</a> describes node invariants.</li>
18 <li> <a href = "#add_methods">Additional Types and Methods</a> describes additional methods
19that tree-based containers support.</li>
20</ol>
21
22<h2><a name = "overview">Overview</a></h2>
23
24<p>
25 Figure
26<a href = "#tree_cd">Tree-based containers</a>
27 shows the container-hierarchy; the tree-based container is circled.
28</p>
29
30<h6 align = "center">
31<a name = "tree_cd">
32<img src = "tree_cd.jpg" width = "70%" alt = "no image">
33</h6>
34<h6 align = "center">
35</a>
36Tree-based containers.
37</h6>
38
39
40<p>
41 The tree-based container has the following declaration:
42</p>
43<pre>
44<b>template</b>&lt;
45 <b>typename</b> Key,
46 <b>typename</b> Data,
47 <b>class</b> Cmp_Fn = std::less&lt;Key&gt;,
48 <b>class</b> DS_Tag = <a href = "rb_tree_ds_tag.html">rb_tree_ds_tag</a>,
49 <b>class</b> Node_Updator = <a href = "null_node_updator.html">null_node_updator</a>,
50 <b>class</b> Allocator =
51 std::allocator&lt;<b>char</b>&gt; &gt;
52<b>class</b> <a href = "tree_assoc_cntnr.html">tree_assoc_cntnr</a>;
53</pre>
54
55
56<p>
57 The parameters have the following meaning:
58</p>
59<ol>
60 <li> <tt>Key</tt> is the key type.
61 </li>
62 <li> <tt>Data</tt> is the data-policy, and is explained in
63<a href = "ms_gen.html#ds_policy">Mapping-Semantics Genericity::Data Types as a Policy</a>.
64 </li>
65 <li> <tt>Cmp_Fn</tt> is a key comparison functor</li>
66 <li> <tt>DS_Tag</tt> specifies which underlying data-structure to use, and is described shortly.
67 <li> <tt>Node_Updator</tt> is a policy for updating node invariants.
68This is described in <a href = "#invariants">Node Invariants</a>.
69 </li>
70 <li> <tt>Allocator</tt> is (surprisingly) an allocator type.
71 </li>
72</ol>
73
74<p>
75 The <tt>DS_Tag</tt> specifies which underlying data-structure to use.
76Instantiating it by
77<a href = "rb_tree_ds_tag.html">rb_tree_ds_tag</a>,
78<a href = "splay_tree_ds_tag.html">splay_tree_ds_tag</a>,
79or
80<a href = "ov_tree_ds_tag.html">ov_tree_ds_tag</a>,
81specifies an undelying
82red-black tree,
83splay tree,
84or
85ordered-vector tree.
86 any other tag is illegal. Note that containers based on the former two contain more types and methods than the latter (<i>e.g.</i>, <tt>reverse_iterator</tt> and <tt>rbegin</tt>), and different exception and invalidation guarantees.
87</p>
88
89
90
91
92<h2><a name = "invariants">Node Invariants</a></h2>
93
94<p>
95 Figure
96<a href = "#node_invariants">Some node invariants</a>
97shows some node invariants. A shows
98a tree whose each node contains, asides from an <tt>double</tt> key, the number
99of nodes at the subtree rooted at the node; B shows a tree whose each node
100contains, asides from a line-interval key, the maximal endpoint of the interval
101of any node in the subtree rooted at the node.
102 The first tree allows querying efficiently what is the order statistic
103of any element; the second tree allows querying efficiently if any, or which,
104intervals overlap a given interval.
105</p>
106
107<h6 align = "center">
108<a name = "node_invariants">
109<img src = "node_invariants.jpg" width = "50%" alt = "no image">
110</a>
111</h6>
112<h6 align = "center">
113Some node invariants.
114</h6>
115
116
117<p>
118 Maintaining such trees is difficult, for two reasons:
119</p>
120<ol>
121 <li> Various operations can invalidate node invariants.
122<i>E.g.</i>, Figure
123<a href = "#node_invariant_invalidations">Invalidation of node invariants</a>
124shows how a right rotation, performed on A, results in B, with nodes <i>x</i>
125and <i>y</i> having corrupted invariants (the greyed nodes in C);
126Figure
127<a href = "#node_invariant_invalidations">Invalidation of node invariants</a>
128shows how an insert, performed on D, results in E, with nodes <i>x</i>
129and <i>y</i> having corrupted invariants (the greyed nodes in F).
130 It is not feasible to know outside the tree the effect of an operation on the
131nodes of the tree.
132 </li>
133 <li>
134 Even if node invariants are maintained, it is not possible to know
135in advance which search paths are required (<i>e.g.</i>, searching for all
136line intervals overlapping some interval might require several search paths).
137 </li>
138</ol>
139
140
141<h6 align = "center">
142<a name = "node_invariant_invalidations">
143<img src = "node_invariant_invalidations.jpg" width = "80%" alt = "no image">
144</a>
145</h6>
146<h6 align = "center">
147Invalidation of node invariants.
148</h6>
149
150<p>
151 These problems are solved by a combination of two means:
152</p>
153
154<ol>
155 <li>
156 The tree-based containers are parameterized by a <tt>Node_Updator</tt>
157parameter. When a tree operation might invalidate some node invariant,
158a <tt>Node_Updator</tt> object is invoked to restore the invariant. This object is
159always invoked with three nodes: some node, say <i>x</i> in
160Figure
161<a href = "#restoring_node_invariants">Invalidation of node invariants</a>-A
162has an invalid invariant, but its children, <i>y</i> and <i>z</i> hav valid invariants.
163After the invocation, all three nodes have valid invariants, as
164in
165Figure
166<a href = "#restoring_node_invariants">Invalidation of node invariants</a>-B.
167It is well known that any <tt>insert</tt>, <tt>erase</tt>,
168<tt>split</tt> or <tt>join</tt>, can restore
169all node invariants by a small number of node invariant updates
170[<a href = "references.html#clrs2001">clrs2001</a>].
171For example, Figure
172<a href = "#update_seq_diagram">
173Insert update sequence diagram
174</a>
175shows an <tt>insert</tt> operation (point A); the tree performs some operations, and
176calls the update functor three times (points B, C, and D).
177 </li>
178 <li>
179 The tree based containers all define internally <tt>node_iterator</tt>
180 and <tt>const_node_iterator</tt>, iterators which can be used to traverse
181 from a node to any of its children or parent.
182 </li>
183</ol>
184
185<h6 align = "center">
186<a name = "restoring_node_invariants">
187<img src = "restoring_node_invariants.jpg" width = "80%" alt = "no image">
188</a>
189</h6>
190<h6 align = "center">
191Invalidation of node invariants.
192</h6>
193
194<h6 align = "center">
195<a name = "update_seq_diagram">
196<img src = "update_seq_diagram.jpg" width = "50%" alt = "no image">
197</a>
198</h6>
199<h6 align = "center">
200Insert update sequence diagram.
201</h6>
202
203
204<p>
205 In
206<a href = "concepts.html#concepts_null_policies">Null Policy Classes</a>
207a distinction was made between <i>redundant policies</i>
208and <i>null policies</i>.
209</p>
210
211<p>
212 Seemingly, in this case a redundant policy - a policy which doesn't
213affect nodes' contents would suffice in this case. This, however, would
214lead to performance loss.
215Figure
216<a href = "#rationale_null_node_updator">
217Rationale for null node-invariant functors
218</a>
219shows a typical case where invariants are restored (in this case, to the
220shaded node). In most cases, tree operations such as rotations affect only
221the lower levels of the tree. A null policy allows to know that there
222is no need to traverse the tree to the root.
223</p>
224
225<h6 align = "center">
226<a name = "rationale_null_node_updator">
227<img src = "rationale_null_node_updator.jpg" width = "50%" alt = "no image">
228</a>
229</h6>
230<h6 align = "center">
231Rationale for null node-invariant functors.
232</h6>
233
234
235
236<h2><a name = "add_methods">Addtional Methods</a></h2>
237
238
239
240
241
242
243
244</body>
245
246</html>