hash_indices.html 74 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159
  1. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0.1 Transitional//EN">
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
  5. <title>Boost.MultiIndex Documentation - Hashed indices reference</title>
  6. <link rel="stylesheet" href="../style.css" type="text/css">
  7. <link rel="start" href="../index.html">
  8. <link rel="prev" href="ord_indices.html">
  9. <link rel="up" href="index.html">
  10. <link rel="next" href="seq_indices.html">
  11. </head>
  12. <body>
  13. <h1><img src="../../../../boost.png" alt="boost.png (6897 bytes)" align=
  14. "middle" width="277" height="86">Boost.MultiIndex Hashed indices reference</h1>
  15. <div class="prev_link"><a href="rnk_indices.html"><img src="../prev.gif" alt="ranked indices" border="0"><br>
  16. Ranked indices
  17. </a></div>
  18. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
  19. Boost.MultiIndex reference
  20. </a></div>
  21. <div class="next_link"><a href="seq_indices.html"><img src="../next.gif" alt="sequenced indices" border="0"><br>
  22. Sequenced indices
  23. </a></div><br clear="all" style="clear: all;">
  24. <hr>
  25. <h2>Contents</h2>
  26. <ul>
  27. <li><a href="#hash_index_fwd_synopsis">Header
  28. <code>"boost/multi_index/hashed_index_fwd.hpp"</code> synopsis</a></li>
  29. <li><a href="#synopsis">Header
  30. <code>"boost/multi_index/hashed_index.hpp"</code> synopsis</a>
  31. <ul>
  32. <li><a href="#unique_non_unique">
  33. Index specifiers <code>hashed_unique</code> and <code>hashed_non_unique</code>
  34. </a></li>
  35. <li><a href="#hash_indices">Hashed indices</a>
  36. <ul>
  37. <li><a href="#complexity_signature">Complexity signature</a></li>
  38. <li><a href="#instantiation_types">Instantiation types</a></li>
  39. <li><a href="#types">Nested types</a></li>
  40. <li><a href="#constructors">Constructors, copy and assignment</a></li>
  41. <li><a href="#iterators">Iterators</a></li>
  42. <li><a href="#modifiers">Modifiers</a></li>
  43. <li><a href="#observers">Observers</a></li>
  44. <li><a href="#lookup">Lookup</a></li>
  45. <li><a href="#bucket_interface">Bucket interface</a></li>
  46. <li><a href="#hash_policy">Hash policy</a></li>
  47. <li><a href="#comparison">Comparison</a></li>
  48. <li><a href="#serialization">Serialization</a></li>
  49. </ul>
  50. </li>
  51. </ul>
  52. </li>
  53. </ul>
  54. <h2>
  55. <a name="hash_index_fwd_synopsis">Header
  56. <a href="../../../../boost/multi_index/hashed_index_fwd.hpp">
  57. <code>"boost/multi_index/hashed_index_fwd.hpp"</code></a> synopsis</a></h2>
  58. <blockquote><pre>
  59. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  60. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  61. <span class=comment>// index specifiers hashed_unique and hashed_non_unique</span>
  62. <span class=keyword>template</span><span class=special>&lt;</span><b>consult hashed_unique reference for arguments</b><span class=special>&gt;</span>
  63. <span class=keyword>struct</span> <span class=identifier>hashed_unique</span><span class=special>;</span>
  64. <span class=keyword>template</span><span class=special>&lt;</span><b>consult hashed_non_unique reference for arguments</b><span class=special>&gt;</span>
  65. <span class=keyword>struct</span> <span class=identifier>hashed_non_unique</span><span class=special>;</span>
  66. <span class=comment>// indices</span>
  67. <span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
  68. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span> <span class=keyword>class</span> <b>index name is implementation defined</b><span class=special>;</span>
  69. <span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
  70. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  71. <span class=special>}</span> <span class=comment>// namespace boost</span>
  72. </pre></blockquote>
  73. <p>
  74. <code>hashed_index_fwd.hpp</code> provides forward declarations for index specifiers
  75. <a href="#unique_non_unique"><code>hashed_unique</code> and <code>hashed_non_unique</code></a> and
  76. their associated <a href="#hash_indices">hashed index</a> classes.
  77. </p>
  78. <h2>
  79. <a name="synopsis">Header
  80. <a href="../../../../boost/multi_index/hashed_index.hpp">
  81. <code>"boost/multi_index/hashed_index.hpp"</code></a> synopsis</a></h2>
  82. <blockquote><pre>
  83. <span class=preprocessor>#include</span> <span class=special>&lt;</span><span class=identifier>initializer_list</span><span class=special>&gt;</span>
  84. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  85. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  86. <span class=comment>// index specifiers hashed_unique and hashed_non_unique</span>
  87. <span class=keyword>template</span><span class=special>&lt;</span><b>consult hashed_unique reference for arguments</b><span class=special>&gt;</span>
  88. <span class=keyword>struct</span> <span class=identifier>hashed_unique</span><span class=special>;</span>
  89. <span class=keyword>template</span><span class=special>&lt;</span><b>consult hashed_non_unique reference for arguments</b><span class=special>&gt;</span>
  90. <span class=keyword>struct</span> <span class=identifier>hashed_non_unique</span><span class=special>;</span>
  91. <span class=comment>// indices</span>
  92. <span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
  93. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span> <span class=keyword>class</span> <b>index class name implementation defined</b><span class=special>;</span>
  94. <span class=comment>// index comparison:</span>
  95. <span class=comment>// <b>OP</b> is any of ==,!=</span>
  96. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
  97. <span class=keyword>bool</span> <span class=keyword>operator</span> <b><i>OP</i></b><span class=special>(</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  98. <span class=comment>// index specialized algorithms:</span>
  99. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
  100. <span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  101. <span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
  102. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  103. <span class=special>}</span> <span class=comment>// namespace boost</span>
  104. </pre></blockquote>
  105. <h3><a name="unique_non_unique">
  106. Index specifiers <code>hashed_unique</code> and <code>hashed_non_unique</code>
  107. </a></h3>
  108. <p>
  109. These <a href="indices.html#index_specification">index specifiers</a> allow
  110. for insertion of <a href="#hash_indices">hashed indices</a> without and with
  111. allowance of duplicate elements, respectively. The syntax of <code>hashed_unique</code>
  112. and <code>hashed_non_unique</code> coincide, thus we describe them in a grouped manner.
  113. <code>hashed_unique</code> and <code>hashed_non_unique</code> can be instantiated in
  114. two different forms, according to whether a tag list for the index is provided or not:
  115. </p>
  116. <blockquote><pre>
  117. <span class=keyword>template</span><span class=special>&lt;</span>
  118. <span class=keyword>typename</span> <span class=identifier>KeyFromValue</span><span class=special>,</span>
  119. <span class=keyword>typename</span> <span class=identifier>Hash</span><span class=special>=</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>hash</span><span class=special>&lt;</span><span class=identifier>KeyFromValue</span><span class=special>::</span><span class=identifier>result_type</span><span class=special>&gt;,</span>
  120. <span class=keyword>typename</span> <span class=identifier>Pred</span><span class=special>=</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>equal_to</span><span class=special>&lt;</span><span class=identifier>KeyFromValue</span><span class=special>::</span><span class=identifier>result_type</span><span class=special>&gt;</span>
  121. <span class=special>&gt;</span>
  122. <span class=keyword>struct</span> <span class=special>(</span><span class=identifier>hashed_unique</span> <span class=special>|</span> <span class=identifier>hashed_non_unique</span><span class=special>)</span><span class=special>;</span>
  123. <span class=keyword>template</span><span class=special>&lt;</span>
  124. <span class=keyword>typename</span> <span class=identifier>TagList</span><span class=special>,</span>
  125. <span class=keyword>typename</span> <span class=identifier>KeyFromValue</span><span class=special>,</span>
  126. <span class=keyword>typename</span> <span class=identifier>Hash</span><span class=special>=</span><span class=identifier>boost</span><span class=special>::</span><span class=identifier>hash</span><span class=special>&lt;</span><span class=identifier>KeyFromValue</span><span class=special>::</span><span class=identifier>result_type</span><span class=special>&gt;,</span>
  127. <span class=keyword>typename</span> <span class=identifier>Pred</span><span class=special>=</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>equal_to</span><span class=special>&lt;</span><span class=identifier>KeyFromValue</span><span class=special>::</span><span class=identifier>result_type</span><span class=special>&gt;</span>
  128. <span class=special>&gt;</span>
  129. <span class=keyword>struct</span> <span class=special>(</span><span class=identifier>hashed_unique</span> <span class=special>|</span> <span class=identifier>hashed_non_unique</span><span class=special>)</span><span class=special>;</span>
  130. </pre></blockquote>
  131. <p>
  132. If provided, <code>TagList</code> must be an instantiation of the class template
  133. <a href="indices.html#tag"><code>tag</code></a>.
  134. The template arguments are used by the corresponding index implementation,
  135. refer to the <a href="#hash_indices">hashed indices</a> reference section for further
  136. explanations on their acceptable type values.
  137. </p>
  138. <h3><a name="hash_indices">Hashed indices</a></h3>
  139. <p>
  140. A hashed index provides fast retrieval of elements of a <code>multi_index_container</code>
  141. through hashing techniques.
  142. A hashed index is particularized according to a given
  143. <a href="key_extraction.html#key_extractors"><code>Key Extractor</code></a>
  144. that retrieves keys from elements of <code>multi_index_container</code>, a <code>Hash</code>
  145. function object which returns hash values for the keys and a binary predicate <code>Pred</code>
  146. acting as an equivalence relation on values of <code>Key</code>.
  147. </p>
  148. <p>
  149. There are two variants of hashed indices: <i>unique</i>, which do
  150. not allow duplicate elements (with respect to its associated equality
  151. predicate) and <i>non-unique</i>, which accept those duplicates.
  152. The interface of these two variants is the same, so they are documented
  153. together, with minor differences explicitly stated when they exist.
  154. </p>
  155. <p>
  156. Except where noted or if the corresponding interface does not exist, hashed indices
  157. (both unique and non-unique) satisfy the C++ requirements for unordered associative
  158. containers at <b>[unord.req]</b> (supporting unique and equivalent keys, respectively.)
  159. Validity of iterators and references to
  160. elements is preserved in all cases. Occasionally, the exception safety guarantees provided
  161. are actually stronger than required by the standard. We only provide descriptions of
  162. those types and operations that do not exactly conform to or are not mandated by the standard
  163. requirements.
  164. </p>
  165. <blockquote><pre>
  166. <span class=keyword>namespace</span> <span class=identifier>boost</span><span class=special>{</span>
  167. <span class=keyword>namespace</span> <span class=identifier>multi_index</span><span class=special>{</span>
  168. <span class=keyword>namespace</span> <span class=identifier>detail</span><span class=special>{</span>
  169. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined: dependent on types Value, Allocator,
  170. TagList, KeyFromValue, Hash, Pred</b><span class=special>&gt;</span>
  171. <span class=keyword>class</span> <b>name is implementation defined</b>
  172. <span class=special>{</span>
  173. <span class=keyword>public</span><span class=special>:</span>
  174. <span class=comment>// types:</span>
  175. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>KeyFromValue</span><span class=special>::</span><span class=identifier>result_type</span> <span class=identifier>key_type</span><span class=special>;</span>
  176. <span class=keyword>typedef</span> <span class=identifier>Value</span> <span class=identifier>value_type</span><span class=special>;</span>
  177. <span class=keyword>typedef</span> <span class=identifier>KeyFromValue</span> <span class=identifier>key_from_value</span><span class=special>;</span>
  178. <span class=keyword>typedef</span> <span class=identifier>Hash</span> <span class=identifier>hasher</span><span class=special>;</span>
  179. <span class=keyword>typedef</span> <span class=identifier>Pred</span> <span class=identifier>key_equal</span><span class=special>;</span>
  180. <span class=keyword>typedef</span> <span class=identifier>boost</span><span class=special>::</span><span class=identifier>tuple</span><span class=special>&lt;</span>
  181. <span class=identifier>size_type</span><span class=special>,</span><span class=identifier>key_from_value</span><span class=special>,</span><span class=identifier>hasher</span><span class=special>,</span><span class=identifier>key_equal</span><span class=special>&gt;</span> <span class=identifier>ctor_args</span><span class=special>;</span>
  182. <span class=keyword>typedef</span> <span class=identifier>TagList</span> <span class=identifier>tag_list</span><span class=special>;</span>
  183. <span class=keyword>typedef</span> <span class=identifier>Allocator</span> <span class=identifier>allocator_type</span><span class=special>;</span>
  184. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=identifier>pointer</span> <span class=identifier>pointer</span><span class=special>;</span>
  185. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=identifier>const_pointer</span> <span class=identifier>const_pointer</span><span class=special>;</span>
  186. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=identifier>reference</span> <span class=identifier>reference</span><span class=special>;</span>
  187. <span class=keyword>typedef</span> <span class=keyword>typename</span> <span class=identifier>Allocator</span><span class=special>::</span><span class=identifier>const_reference</span> <span class=identifier>const_reference</span><span class=special>;</span>
  188. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>size_type</span><span class=special>;</span>
  189. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>difference_type</span><span class=special>;</span>
  190. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>iterator</span><span class=special>;</span>
  191. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>const_iterator</span><span class=special>;</span>
  192. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>local_iterator</span><span class=special>;</span>
  193. <span class=keyword>typedef</span> <b>implementation defined </b><span class=identifier>const_local_iterator</span><span class=special>;</span>
  194. <span class=comment>// construct/destroy/copy:</span>
  195. <b>index class name</b><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>=(</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  196. <b>index class name</b><span class=special>&amp;</span> <span class=keyword>operator</span><span class=special>=(</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>initializer_list</span><span class=special>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;</span> <span class=identifier>list</span><span class=special>);</span>
  197. <span class=identifier>allocator_type</span> <span class=identifier>get_allocator</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  198. <span class=comment>// size and capacity:</span>
  199. <span class=keyword>bool</span> <span class=identifier>empty</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  200. <span class=identifier>size_type</span> <span class=identifier>size</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  201. <span class=identifier>size_type</span> <span class=identifier>max_size</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  202. <span class=comment>// iterators:</span>
  203. <span class=identifier>iterator</span> <span class=identifier>begin</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
  204. <span class=identifier>const_iterator</span> <span class=identifier>begin</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  205. <span class=identifier>iterator</span> <span class=identifier>end</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
  206. <span class=identifier>const_iterator</span> <span class=identifier>end</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  207. <span class=identifier>const_iterator</span> <span class=identifier>cbegin</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  208. <span class=identifier>const_iterator</span> <span class=identifier>cend</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  209. <span class=identifier>iterator</span> <span class=identifier>iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  210. <span class=identifier>const_iterator</span> <span class=identifier>iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  211. <span class=comment>// modifiers:</span>
  212. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Args</span><span class=special>&gt;</span>
  213. <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>emplace</span><span class=special>(</span><span class=identifier>Args</span><span class=special>&amp;&amp;...</span> <span class=identifier>args</span><span class=special>);</span>
  214. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span><span class=special>...</span> <span class=identifier>Args</span><span class=special>&gt;</span>
  215. <span class=identifier>iterator</span> <span class=identifier>emplace_hint</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Args</span><span class=special>&amp;&amp;...</span> <span class=identifier>args</span><span class=special>);</span>
  216. <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>insert</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  217. <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=keyword>bool</span><span class=special>&gt;</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  218. <span class=identifier>iterator</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  219. <span class=identifier>iterator</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  220. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>InputIterator</span><span class=special>&gt;</span>
  221. <span class=keyword>void</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>InputIterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>InputIterator</span> <span class=identifier>last</span><span class=special>);</span>
  222. <span class=keyword>void</span> <span class=identifier>insert</span><span class=special>(</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>initializer_list</span><span class=special>&lt;</span><span class=identifier>value_type</span><span class=special>&gt;</span> <span class=identifier>list</span><span class=special>);</span>
  223. <span class=identifier>iterator</span> <span class=identifier>erase</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>);</span>
  224. <span class=identifier>size_type</span> <span class=identifier>erase</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  225. <span class=identifier>iterator</span> <span class=identifier>erase</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>first</span><span class=special>,</span><span class=identifier>iterator</span> <span class=identifier>last</span><span class=special>);</span>
  226. <span class=keyword>bool</span> <span class=identifier>replace</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  227. <span class=keyword>bool</span> <span class=identifier>replace</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>value_type</span><span class=special>&amp;&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  228. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>&gt;</span> <span class=keyword>bool</span> <span class=identifier>modify</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>);</span>
  229. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Rollback</span><span class=special>&gt;</span>
  230. <span class=keyword>bool</span> <span class=identifier>modify</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>,</span><span class=identifier>Rollback</span> <span class=identifier>back</span><span class=special>);</span>
  231. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>&gt;</span> <span class=keyword>bool</span> <span class=identifier>modify_key</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>);</span>
  232. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>Modifier</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>Rollback</span><span class=special>&gt;</span>
  233. <span class=keyword>bool</span> <span class=identifier>modify_key</span><span class=special>(</span><span class=identifier>iterator</span> <span class=identifier>position</span><span class=special>,</span><span class=identifier>Modifier</span> <span class=identifier>mod</span><span class=special>,</span><span class=identifier>Rollback</span> <span class=identifier>back</span><span class=special>);</span>
  234. <span class=keyword>void</span> <span class=identifier>clear</span><span class=special>()</span><span class=keyword>noexcept</span><span class=special>;</span>
  235. <span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  236. <span class=comment>// observers:</span>
  237. <span class=identifier>key_from_value</span> <span class=identifier>key_extractor</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  238. <span class=identifier>hasher</span> <span class=identifier>hash_function</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  239. <span class=identifier>key_equal</span> <span class=identifier>key_eq</span><span class=special>()</span><span class=keyword>const</span><span class=special>;</span>
  240. <span class=comment>// lookup:</span>
  241. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>&gt;</span>
  242. <span class=identifier>iterator</span> <span class=identifier>find</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  243. <span class=keyword>template</span><span class=special>&lt;</span>
  244. <span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompatibleHash</span><span class=special>,</span> <span class=keyword>typename</span> <span class=identifier>CompatiblePred</span>
  245. <span class=special>&gt;</span>
  246. <span class=identifier>iterator</span> <span class=identifier>find</span><span class=special>(</span>
  247. <span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  248. <span class=keyword>const</span> <span class=identifier>CompatibleHash</span><span class=special>&amp;</span> <span class=identifier>hash</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>CompatiblePred</span><span class=special>&amp;</span> <span class=identifier>eq</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  249. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>&gt;</span>
  250. <span class=identifier>size_type</span> <span class=identifier>count</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  251. <span class=keyword>template</span><span class=special>&lt;</span>
  252. <span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompatibleHash</span><span class=special>,</span> <span class=keyword>typename</span> <span class=identifier>CompatiblePred</span>
  253. <span class=special>&gt;</span>
  254. <span class=identifier>size_type</span> <span class=identifier>count</span><span class=special>(</span>
  255. <span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span>
  256. <span class=keyword>const</span> <span class=identifier>CompatibleHash</span><span class=special>&amp;</span> <span class=identifier>hash</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>CompatiblePred</span><span class=special>&amp;</span> <span class=identifier>eq</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  257. <span class=keyword>template</span><span class=special>&lt;</span><span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>&gt;</span>
  258. <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=identifier>iterator</span><span class=special>&gt;</span> <span class=identifier>equal_range</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  259. <span class=keyword>template</span><span class=special>&lt;</span>
  260. <span class=keyword>typename</span> <span class=identifier>CompatibleKey</span><span class=special>,</span><span class=keyword>typename</span> <span class=identifier>CompatibleHash</span><span class=special>,</span> <span class=keyword>typename</span> <span class=identifier>CompatiblePred</span>
  261. <span class=special>&gt;</span>
  262. <span class=identifier>std</span><span class=special>::</span><span class=identifier>pair</span><span class=special>&lt;</span><span class=identifier>iterator</span><span class=special>,</span><span class=identifier>iterator</span><span class=special>&gt;</span> <span class=identifier>equal_range</span><span class=special>(</span>
  263. <span class=keyword>const</span> <span class=identifier>CompatibleKey</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,
  264. </span><span class=keyword>const</span> <span class=identifier>CompatibleHash</span><span class=special>&amp;</span> <span class=identifier>hash</span><span class=special>,</span><span class=keyword>const</span> <span class=identifier>CompatiblePred</span><span class=special>&amp;</span> <span class=identifier>eq</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  265. <span class=comment>// bucket interface:</span>
  266. <span class=identifier>size_type</span> <span class=identifier>bucket_count</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  267. <span class=identifier>size_type</span> <span class=identifier>max_bucket_count</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  268. <span class=identifier>size_type</span> <span class=identifier>bucket_size</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  269. <span class=identifier>size_type</span> <span class=identifier>bucket</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>key_type</span><span class=special>&amp;</span> <span class=identifier>k</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  270. <span class=identifier>local_iterator</span> <span class=identifier>begin</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>);</span>
  271. <span class=identifier>const_local_iterator</span> <span class=identifier>begin</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  272. <span class=identifier>local_iterator</span> <span class=identifier>end</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>);</span>
  273. <span class=identifier>const_local_iterator</span> <span class=identifier>end</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  274. <span class=identifier>const_local_iterator</span> <span class=identifier>cbegin</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  275. <span class=identifier>const_local_iterator</span> <span class=identifier>cend</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  276. <span class=identifier>local_iterator</span> <span class=identifier>local_iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>);</span>
  277. <span class=identifier>const_local_iterator</span> <span class=identifier>local_iterator_to</span><span class=special>(</span><span class=keyword>const</span> <span class=identifier>value_type</span><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>)</span><span class=keyword>const</span><span class=special>;</span>
  278. <span class=comment>// hash policy:</span>
  279. <span class=keyword>float</span> <span class=identifier>load_factor</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  280. <span class=keyword>float</span> <span class=identifier>max_load_factor</span><span class=special>()</span><span class=keyword>const</span> <span class=keyword>noexcept</span><span class=special>;</span>
  281. <span class=keyword>void</span> <span class=identifier>max_load_factor</span><span class=special>(</span><span class=keyword>float</span> <span class=identifier>z</span><span class=special>);</span>
  282. <span class=keyword>void</span> <span class=identifier>rehash</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>);</span>
  283. <span class=keyword>void</span> <span class=identifier>reserve</span><span class=special>(</span><span class=identifier>size_type</span> <span class=identifier>n</span><span class=special>);</span>
  284. <span class=special>};</span>
  285. <span class=comment>// index comparison:</span>
  286. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
  287. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>==(</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span><span class=special>;</span>
  288. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
  289. <span class=keyword>bool</span> <span class=keyword>operator</span><span class=special>!=(</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><span class=keyword>const</span> <b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>)</span>
  290. <span class=special>{</span>
  291. <span class=keyword>return</span> <span class=special>!(</span><span class=identifier>x</span><span class=special>==</span><span class=identifier>y</span><span class=special>);</span>
  292. <span class=special>}</span>
  293. <span class=comment>// index specialized algorithms:</span>
  294. <span class=keyword>template</span><span class=special>&lt;</span><b>implementation defined</b><span class=special>&gt;</span>
  295. <span class=keyword>void</span> <span class=identifier>swap</span><span class=special>(</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>x</span><span class=special>,</span><b>index class name</b><span class=special>&amp;</span> <span class=identifier>y</span><span class=special>);</span>
  296. <span class=special>}</span> <span class=comment>// namespace boost::multi_index::detail</span>
  297. <span class=special>}</span> <span class=comment>// namespace boost::multi_index</span>
  298. <span class=special>}</span> <span class=comment>// namespace boost</span>
  299. </pre></blockquote>
  300. <h4><a name="complexity_signature">Complexity signature</a></h4>
  301. <p>
  302. Here and in the descriptions of operations of hashed indices, we adopt the
  303. scheme outlined in the
  304. <a href="indices.html#complexity_signature">complexity signature
  305. section</a>. The complexity signature of hashed indices is:
  306. <ul>
  307. <li>copying: <code>c(n)=n*log(n)</code>,</li>
  308. <li>insertion: average case <code>i(n)=1</code> (amortized constant),
  309. worst case <code>i(n)=n<sub>dist</sub></code>,</li>
  310. <li>hinted insertion: average case <code>h(n)=1</code> (amortized constant),
  311. worst case <code>h(n)=n<sub>dist</sub></code>,</li>
  312. <li>deletion: <code>d(n)=1</code> (constant),</li>
  313. <li>replacement:
  314. <ul>
  315. <li>if the new element key is equivalent to the original, <code>r(n)=1</code> (constant),</li>
  316. <li>otherwise, average case <code>r(n)=1</code> (constant),
  317. worst case <code>r(n)=n<sub>dist</sub></code>,</li>
  318. </ul></li>
  319. <li>modifying: average case <code>m(n)=1</code> (constant),
  320. worst case <code>m(n)=n<sub>dist</sub></code>,</li>
  321. </ul>
  322. where <code>n<sub>dist</sub></code> is the number of non-equivalent elements out of
  323. the total <code>n</code>.
  324. </p>
  325. <h4><a name="instantiation_types">Instantiation types</a></h4>
  326. <p>Hashed indices are instantiated internally to <code>multi_index_container</code> and
  327. specified by means of <a href="indices.html#indexed_by"><code>indexed_by</code></a>
  328. with <a href="#unique_non_unique"> index specifiers <code>hashed_unique</code>
  329. and <code>hashed_non_unique</code></a>. Instantiations are dependent on the
  330. following types:
  331. <ul>
  332. <li><code>Value</code> from <code>multi_index_container</code>,</li>
  333. <li><code>Allocator</code> from <code>multi_index_container</code>,</li>
  334. <li><code>TagList</code> from the index specifier (if provided, otherwise <code>tag&lt;&gt;</code> is assumed),</li>
  335. <li><code>KeyFromValue</code> from the index specifier,</li>
  336. <li><code>Hash</code> from the index specifier,</li>
  337. <li><code>Pred</code> from the index specifier.</li>
  338. </ul>
  339. <code>TagList</code> must be an instantiation of
  340. <a href="indices.html#tag"><code>tag</code></a>. The type <code>KeyFromValue</code>,
  341. which determines the mechanism for extracting a key from <code>Value</code>,
  342. must be a model of <a href="key_extraction.html#key_extractors">
  343. <code>Key Extractor</code></a> from <code>Value</code>. <code>Hash</code> is a
  344. <code>CopyConstructible</code>unary function object
  345. taking a single argument of type <code>KeyFromValue::result_type</code> and returning a
  346. value of type <code>std::size_t</code> in the range
  347. <code>[0, std::numeric_limits&lt;std::size_t&gt;::max())</code>.
  348. <code>Pred</code> is a <code>CopyConstructible</code> binary predicate inducing an equivalence relation
  349. on elements of <code>KeyFromValue::result_type</code>. It is required that
  350. the <code>Hash</code> object return the same value for keys
  351. equivalent under <code>Pred</code>.
  352. </p>
  353. <h4><a name="types">Nested types</a></h4>
  354. <code>ctor_args</code>
  355. <blockquote>
  356. The first element of this tuple indicates the minimum number of buckets
  357. set up by the index on construction time. If the default value 0 is used,
  358. an implementation defined number is used instead.
  359. </blockquote>
  360. <code>iterator<br>
  361. const_iterator<br>
  362. local_iterator<br>
  363. const_local_iterator</code>
  364. <blockquote>
  365. These types are forward iterators.
  366. </blockquote>
  367. <h4><a name="constructors">Constructors, copy and assignment</a></h4>
  368. <p>
  369. As explained in the <a href="indices.html#index_concepts">index
  370. concepts section</a>, indices do not have public constructors or destructors.
  371. Assignment, on the other hand, is provided. Upon construction,
  372. <code>max_load_factor()</code> is 1.0.
  373. </p>
  374. <code><b>index class name</b>&amp; operator=(const <b>index class name</b>&amp; x);</code>
  375. <blockquote>
  376. <b>Effects:</b>
  377. <blockquote><pre>
  378. <span class=identifier>a</span><span class=special>=</span><span class=identifier>b</span><span class=special>;</span>
  379. </pre></blockquote>
  380. where <code>a</code> and <code>b</code> are the <code>multi_index_container</code>
  381. objects to which <code>*this</code> and <code>x</code> belong, respectively.<br>
  382. <b>Returns:</b> <code>*this</code>.<br>
  383. </blockquote>
  384. <code><b>index class name</b>&amp; operator=(std::initializer_list&lt;value_type&gt; list);</code>
  385. <blockquote>
  386. <b>Effects:</b>
  387. <blockquote><pre>
  388. <span class=identifier>a</span><span class=special>=</span><span class=identifier>list</span><span class=special>;</span>
  389. </pre></blockquote>
  390. where <code>a</code> is the <code>multi_index_container</code>
  391. object to which <code>*this</code> belongs.<br>
  392. <b>Returns:</b> <code>*this</code>.<br>
  393. </blockquote>
  394. <h4><a name="iterators">Iterators</a></h4>
  395. <code>iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;iterator_to(const value_type&amp; x);<br>
  396. const_iterator iterator_to(const value_type&amp; x)const;</code>
  397. <blockquote>
  398. <b>Requires:</b> <code>x</code> is a reference to an element of the container.<br>
  399. <b>Returns:</b> An iterator to <code>x</code>.<br>
  400. <b>Complexity:</b> Constant.<br>
  401. <b>Exception safety:</b> <code>nothrow</code>.<br>
  402. </blockquote>
  403. <h4><a name="modifiers">Modifiers</a></h4>
  404. <code>template&lt;typename... Args&gt;<br>
  405. std::pair&lt;iterator,bool&gt; emplace(Args&amp;&amp;... args);</code>
  406. <blockquote>
  407. <b>Requires:</b> <code>value_type</code> is <code>EmplaceConstructible</code>
  408. into <code>multi_index_container</code> from <code>args</code>.<br>
  409. <b>Effects:</b> Inserts a <code>value_type</code> object constructed with
  410. <code>std::forward&lt;Args&gt;(args)...</code> into the <code>multi_index_container</code> to which
  411. the index belongs if
  412. <ul>
  413. <li>the index is non-unique OR no other element exists with
  414. equivalent key,</li>
  415. <li>AND insertion is allowed by all other indices of the
  416. <code>multi_index_container</code>.</li>
  417. </ul>
  418. <b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
  419. is <code>true</code> if and only if insertion took place. On successful insertion,
  420. <code>p.first</code> points to the element inserted; otherwise, <code>p.first</code>
  421. points to an element that caused the insertion to be banned. Note that more than
  422. one element can be causing insertion not to be allowed.<br>
  423. <b>Complexity:</b> <code>O(I(n))</code>.<br>
  424. <b>Exception safety:</b> Strong, except that rehashing may occur even if the operation fails.<br>
  425. </blockquote>
  426. <code>template&lt;typename... Args&gt;<br>
  427. iterator emplace_hint(iterator position, Args&amp;&amp;... args);</code>
  428. <blockquote>
  429. <b>Requires:</b> <code>value_type</code> is <code>EmplaceConstructible</code>
  430. into <code>multi_index_container</code> from <code>args</code>.
  431. <code>position</code> is a valid iterator of the index.<br>
  432. <b>Effects:</b> Inserts a <code>value_type</code> object constructed with
  433. <code>std::forward&lt;Args&gt;(args)...</code> into the <code>multi_index_container</code> to which
  434. the index belongs if
  435. <ul>
  436. <li>the index is non-unique OR no other element exists with
  437. equivalent key,</li>
  438. <li>AND insertion is allowed by all other indices of the
  439. <code>multi_index_container</code>.</li>
  440. </ul>
  441. <code>position</code> is used as a hint to improve the efficiency of the
  442. operation.<br>
  443. <b>Returns:</b> On successful insertion, an iterator to the newly inserted
  444. element. Otherwise, an iterator to an element that caused the insertion to be
  445. banned. Note that more than one element can be causing insertion not to be
  446. allowed.<br>
  447. <b>Complexity:</b> <code>O(H(n))</code>.<br>
  448. <b>Exception safety:</b> Strong, except that rehashing may occur even if the operation fails.<br>
  449. </blockquote>
  450. <code>std::pair&lt;iterator,bool> insert(const value_type&amp; x);</code><br>
  451. <code>std::pair&lt;iterator,bool> insert(value_type&amp;&amp; x);</code>
  452. <blockquote>
  453. <b>Requires (first version):</b> <code>value_type</code> is <code>CopyInsertable</code>
  454. into <code>multi_index_container</code>.<br>
  455. <b>Requires (second version):</b> <code>value_type</code> is <code>MoveInsertable</code>
  456. into <code>multi_index_container</code>.<br>
  457. <b>Effects:</b> Inserts <code>x</code> into the <code>multi_index_container</code> to which
  458. the index belongs if
  459. <ul>
  460. <li>the index is non-unique OR no other element exists with
  461. equivalent key,</li>
  462. <li>AND insertion is allowed by all other indices of the
  463. <code>multi_index_container</code>.</li>
  464. </ul>
  465. <b>Returns:</b> The return value is a pair <code>p</code>. <code>p.second</code>
  466. is <code>true</code> if and only if insertion took place. On successful insertion,
  467. <code>p.first</code> points to the element inserted; otherwise, <code>p.first</code>
  468. points to an element that caused the insertion to be banned. Note that more than
  469. one element can be causing insertion not to be allowed.<br>
  470. <b>Complexity:</b> <code>O(I(n))</code>.<br>
  471. <b>Exception safety:</b> Strong, except that rehashing may occur even if the operation fails.<br>
  472. </blockquote>
  473. <code>iterator insert(iterator position,const value_type&amp; x);</code><br>
  474. <code>iterator insert(iterator position,value_type&amp;&amp; x);</code>
  475. <blockquote>
  476. <b>Requires (first version):</b> <code>value_type</code> is <code>CopyInsertable</code>
  477. into <code>multi_index_container</code>.
  478. <code>position</code> is a valid iterator of the index.<br>
  479. <b>Requires (second version):</b> <code>value_type</code> is <code>MoveInsertable</code>
  480. into <code>multi_index_container</code>.
  481. <code>position</code> is a valid iterator of the index.<br>
  482. <b>Effects:</b> Inserts <code>x</code> into the <code>multi_index_container</code> to which
  483. the index belongs if
  484. <ul>
  485. <li>the index is non-unique OR no other element exists with
  486. equivalent key,</li>
  487. <li>AND insertion is allowed by all other indices of the
  488. <code>multi_index_container</code>.</li>
  489. </ul>
  490. <code>position</code> is used as a hint to improve the efficiency of the
  491. operation.<br>
  492. <b>Returns:</b> On successful insertion, an iterator to the newly inserted
  493. element. Otherwise, an iterator to an element that caused the insertion to be
  494. banned. Note that more than one element can be causing insertion not to be
  495. allowed.<br>
  496. <b>Complexity:</b> <code>O(H(n))</code>.<br>
  497. <b>Exception safety:</b> Strong, except that rehashing may occur even if the operation fails.<br>
  498. </blockquote>
  499. <code>template&lt;typename InputIterator><br>
  500. void insert(InputIterator first,InputIterator last);</code>
  501. <blockquote>
  502. <b>Requires:</b> <code>InputIterator</code> is an input iterator.
  503. <code>value_type</code> is
  504. <code>EmplaceConstructible</code> into
  505. <code>multi_index_container</code> from <code>*first</code>.
  506. <code>first</code> and <code>last</code> are not iterators into any
  507. index of the <code>multi_index_container</code> to which this index belongs.
  508. <code>last</code> is reachable from <code>first</code>.<br>
  509. <b>Effects:</b>
  510. For each element of [<code>first</code>, <code>last</code>), in this
  511. order, inserts it into the <code>multi_index_container</code>
  512. to which this index belongs if
  513. <ul>
  514. <li>the index is non-unique OR no other element exists with
  515. equivalent key,</li>
  516. <li>AND insertion is allowed by all other indices of the
  517. <code>multi_index_container</code>.</li>
  518. </ul>
  519. <b>Complexity:</b> <code>O(m*I(n+m))</code>, where
  520. <code>m</code> is the number of elements in [<code>first</code>,
  521. <code>last</code>).<br>
  522. <b>Exception safety:</b> Basic.<br>
  523. </blockquote>
  524. <code>void insert(std::initializer_list&lt;value_type&gt; list);</code>
  525. <blockquote>
  526. <b>Effects:</b>
  527. <blockquote><pre>
  528. <span class=identifier>insert</span><span class=special>(</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>begin</span><span class=special>(),</span><span class=identifier>list</span><span class=special>.</span><span class=identifier>end</span><span class=special>())</span><span class=special>;</span>
  529. </pre></blockquote>
  530. </blockquote>
  531. <code>iterator erase(iterator position);</code>
  532. <blockquote>
  533. <b>Requires:</b> <code>position</code> is a valid dereferenceable iterator
  534. of the index.<br>
  535. <b>Effects:</b> Deletes the element pointed to by <code>position</code>.<br>
  536. <b>Returns:</b> An iterator pointing to the element immediately following
  537. the one that was deleted, or <code>end()</code>
  538. if no such element exists.<br>
  539. <b>Complexity:</b> <code>O(D(n))</code>.<br>
  540. <b>Exception safety:</b> <code>nothrow</code>.<br>
  541. </blockquote>
  542. <code>size_type erase(const key_type&amp; x);</code>
  543. <blockquote>
  544. <b>Effects:</b> Deletes the elements with key equivalent to <code>x</code>.<br>
  545. <b>Returns:</b> Number of elements deleted.<br>
  546. <b>Complexity:</b> Average case, <code>O(1 + m*D(n))</code>, worst case
  547. <code>O(n<sub>dist</sub> + m*D(n))</code>, where <code>m</code> is
  548. the number of elements deleted.<br>
  549. <b>Exception safety:</b> Basic.<br>
  550. </blockquote>
  551. <code>iterator erase(iterator first,iterator last);</code>
  552. <blockquote>
  553. <b>Requires:</b> [<code>first</code>,<code>last</code>) is a valid
  554. range of the index.<br>
  555. <b>Effects:</b> Deletes the elements in [<code>first</code>,<code>last</code>).<br>
  556. <b>Returns:</b> <code>last</code>.<br>
  557. <b>Complexity:</b> <code>O(m*D(n))</code>, where <code>m</code> is
  558. the number of elements in [<code>first</code>,<code>last</code>).<br>
  559. <b>Exception safety:</b> <code>nothrow</code>.<br>
  560. </blockquote>
  561. <a name="replace"><code>bool replace(iterator position,const value_type&amp; x);</code></a><br>
  562. <code>bool replace(iterator position,value_type&amp;&amp; x);</code>
  563. <blockquote>
  564. <b>Requires (first version):</b> <code>value_type</code> is <code>CopyAssignable</code>.
  565. <code>position</code> is a valid dereferenceable iterator of the index.<br>
  566. <b>Requires (second version):</b> <code>value_type</code> is <code>MoveAssignable</code>.
  567. <code>position</code> is a valid dereferenceable iterator of the index.<br>
  568. <b>Effects:</b> Assigns the value <code>x</code> to the element pointed
  569. to by <code>position</code> into the <code>multi_index_container</code> to which
  570. the index belongs if, for the value <code>x</code>
  571. <ul>
  572. <li>the index is non-unique OR no other element exists
  573. (except possibly <code>*position</code>) with equivalent key,</li>
  574. <li>AND replacing is allowed by all other indices of the
  575. <code>multi_index_container</code>.</li>
  576. </ul>
  577. <b>Postconditions:</b> Validity of <code>position</code> is preserved
  578. in all cases. If the key of the new value is equivalent to that of the replaced value,
  579. the position of the element does not change.<br>
  580. <b>Returns:</b> <code>true</code> if the replacement took place,
  581. <code>false</code> otherwise.<br>
  582. <b>Complexity:</b> <code>O(R(n))</code>.<br>
  583. <b>Exception safety:</b> Strong. If an exception is thrown by some
  584. user-provided operation the <code>multi_index_container</code> to which the index
  585. belongs remains in its original state.
  586. </blockquote>
  587. <a name="modify">
  588. <code>template&lt;typename Modifier> bool modify(iterator position,Modifier mod);</code></a>
  589. <blockquote>
  590. <b>Requires:</b> <code>mod</code> is a unary function object
  591. accepting arguments of type
  592. <code>value_type&amp;</code>. <code>position</code> is a valid dereferenceable
  593. iterator of the index.
  594. The execution of <code>mod(e)</code>, where <code>e</code> is the element
  595. pointed to by <code>position</code>, does not invoke any operation of the
  596. <code>multi_index_container</code> after <code>e</code> is directly modified
  597. or, before modification, if the operation would invalidate <code>position</code>.<br>
  598. <b>Effects:</b> Calls <code>mod(e)</code> where <code>e</code> is the element
  599. pointed to by <code>position</code> and rearranges <code>*position</code> into
  600. all the indices of the <code>multi_index_container</code>. Rearrangement is successful if
  601. <ul>
  602. <li>the index is non-unique OR no other element exists
  603. with equivalent key,</li>
  604. <li>AND rearrangement is allowed by all other indices of the
  605. <code>multi_index_container</code>.</li>
  606. </ul>
  607. If the rearrangement fails, the element is erased.<br>
  608. <b>Postconditions:</b> Validity of <code>position</code> is preserved if the
  609. operation succeeds. If the key of the modified value is equivalent to that of the
  610. original value, the position of the element does not change.<br>
  611. <b>Returns:</b> <code>true</code> if the operation succeeded, <code>false</code>
  612. otherwise.<br>
  613. <b>Complexity:</b> <code>O(M(n))</code>.<br>
  614. <b>Exception safety:</b> Basic. If an exception is thrown by some
  615. user-provided operation (including <code>mod</code>), then
  616. the element pointed to by <code>position</code> is erased.
  617. </blockquote>
  618. <code>template&lt;typename Modifier,typename Rollback><br>
  619. bool modify(iterator position,Modifier mod,Rollback back);</code>
  620. <blockquote>
  621. <b>Requires:</b> <code>mod</code> and <code>back</code> are unary function
  622. objects accepting arguments of type
  623. <code>value_type&amp;</code>. <code>position</code> is a valid dereferenceable
  624. iterator of the index.
  625. The execution of <code>mod(e)</code>, where <code>e</code> is the element
  626. pointed to by <code>position</code>, does not invoke any operation of the
  627. <code>multi_index_container</code> after <code>e</code> is directly modified
  628. or, before modification, if the operation would invalidate <code>position</code>.
  629. <code>back(e)</code> does not invoke any operation of the
  630. <code>multi_index_container</code>.<br>
  631. <b>Effects:</b> Calls <code>mod(e)</code> where <code>e</code> is the element
  632. pointed to by <code>position</code> and tries to rearrange <code>*position</code> into
  633. all the indices of the <code>multi_index_container</code>. Rearrangement is successful if
  634. <ul>
  635. <li>the index is non-unique OR no other element exists
  636. with equivalent key,</li>
  637. <li>AND rearrangement is allowed by all other indices of the
  638. <code>multi_index_container</code>.</li>
  639. </ul>
  640. If the rearrangement fails, <code>back(e)</code> is invoked: if the resulting value
  641. of <code>e</code> is consistent with its original position and constraints in all
  642. indices, the element is kept, otherwise it is erased.<br>
  643. <b>Postconditions:</b> Validity of <code>position</code> is preserved except if
  644. the element is erased under the conditions described below.
  645. If the key of the modified value is equivalent to that of the
  646. original value, the position of the element does not change.<br>
  647. <b>Returns:</b> <code>true</code> if the operation succeeded, <code>false</code>
  648. otherwise.<br>
  649. <b>Complexity:</b> <code>O(M(n))</code>.<br>
  650. <b>Exception safety:</b> Strong, except if <code>mod</code> or <code>back</code> throw an
  651. exception or <code>back(e)</code> fails to properly restore the element or there is
  652. a throwing user-provided operation after invoking <code>back(e)</code>, in which cases
  653. the modified element is erased. If <code>back</code>
  654. throws inside the handling code executing after some other user-provided
  655. operation has thrown, it is the exception generated by <code>back</code> that
  656. is rethrown.
  657. </blockquote>
  658. <a name="modify_key">
  659. <code>template&lt;typename Modifier> bool modify_key(iterator position,Modifier mod);</code></a>
  660. <blockquote>
  661. <b>Requires:</b> <code>key_from_value</code> is a read/write
  662. <a href="key_extraction.html#key_extractors"><code>Key Extractor</code></a>
  663. from <code>value_type</code>. <code>mod</code> is a
  664. unary function object accepting arguments of type
  665. <code>key_type&amp;</code>. <code>position</code> is a valid dereferenceable
  666. iterator of the index.
  667. The execution of <code>mod(k)</code>, where <code>k</code> is the key of the element
  668. pointed to by <code>position</code>, does not invoke any operation of the
  669. <code>multi_index_container</code> after <code>k</code> is directly modified
  670. or, before modification, if the operation would invalidate <code>position</code>.<br>
  671. <b>Effects:</b> Equivalent to <code>modify(position,mod')</code>,
  672. with <code>mod'</code> defined in such a way that
  673. <code>mod'(x)</code> is the same as <code>mod(key(x))</code>, where
  674. <code>key</code> is the internal <code>KeyFromValue</code> object of the index.
  675. </blockquote>
  676. <code>template&lt;typename Modifier,typename Rollback><br>
  677. bool modify_key(iterator position,Modifier mod,Rollback back);</code>
  678. <blockquote>
  679. <b>Requires:</b> <code>key_from_value</code> is a read/write
  680. <a href="key_extraction.html#key_extractors"><code>Key Extractor</code></a>
  681. from <code>value_type</code>. <code>mod</code> and <code>back</code>
  682. are unary function objects accepting arguments of type
  683. <code>key_type&amp;</code>. <code>position</code> is a valid dereferenceable
  684. iterator of the index.
  685. The execution of <code>mod(k)</code>, where <code>k</code> is the key of the element
  686. pointed to by <code>position</code>, does not invoke any operation of the
  687. <code>multi_index_container</code> after <code>k</code> is directly modified
  688. or, before modification, if the operation would invalidate <code>position</code>.
  689. <code>back(k)</code> does not invoke any operation of the
  690. <code>multi_index_container</code>.<br>
  691. <b>Effects:</b> Equivalent to <code>modify(position,mod',back')</code>,
  692. with <code>mod'</code> and <code>back</code> defined in such a way that
  693. <code>mod'(x)</code> is the same as <code>mod(key(x))</code> and
  694. <code>back'(x)</code> is the same as <code>back(key(x))</code>, where
  695. <code>key</code> is the internal <code>KeyFromValue</code> object of the index.
  696. </blockquote>
  697. <h4><a name="observers">Observers</a></h4>
  698. <p>Apart from standard <code>hash_function</code> and <code>key_eq</code>,
  699. hashed indices have a member function for retrieving the internal key extractor
  700. used.
  701. </p>
  702. <code>key_from_value key_extractor()const;</code>
  703. <blockquote>
  704. Returns a copy of the <code>key_from_value</code> object used to construct
  705. the index.<br>
  706. <b>Complexity:</b> Constant.
  707. </blockquote>
  708. <h4><a name="lookup">Lookup</a></h4>
  709. <p>
  710. Hashed indices provide the full lookup functionality required by
  711. <b>[unord.req]</b>, namely <code>find</code>,
  712. <code>count</code>, and <code>equal_range</code>. Additionally,
  713. these member functions are templatized to allow for non-standard
  714. arguments, so extending the types of search operations allowed.
  715. The kind of arguments permissible when invoking the lookup member
  716. functions is defined by the following concept.
  717. </p>
  718. <p>
  719. Consider a pair (<code>Hash</code>, <code>Pred</code>) where
  720. <code>Hash</code> is a hash functor over values of type <code>Key</code>
  721. and <code>Pred</code> is a binary predicate
  722. inducing an equivalence relation
  723. on <code>Key</code>, with the additional constraint that equivalent
  724. keys have the same hash value.
  725. A triplet of types (<code>CompatibleKey</code>, <code>CompatibleHash</code>,
  726. <code>CompatiblePred</code>) is said to be a <i>compatible extension</i>
  727. of (<code>Hash</code>, <code>Pred</code>) if
  728. <ol>
  729. <li><code>CompatibleHash</code> is a hash functor on values of
  730. type <code>CompatibleKey</code>,</li>
  731. <li><code>CompatiblePred</code> is a binary predicate over (<code>Key</code>,
  732. <code>CompatibleKey</code>),</li>
  733. <li><code>CompatiblePred</code> is a binary predicate over (<code>CompatibleKey</code>,
  734. <code>Key</code>),</li>
  735. <li>if <code>c_eq(ck,k1)</code> then <code>c_eq(k1,ck)</code>,</li>
  736. <li>if <code>c_eq(ck,k1)</code> and <code>eq(k1,k2)</code> then
  737. <code>c_eq(ck,k2)</code>,</li>
  738. <li>if <code>c_eq(ck,k1)</code> and <code>c_eq(ck,k2)</code> then
  739. <code>eq(k1,k2)</code>,</li>
  740. <li>if <code>c_eq(ck,k1)</code> then <code>c_hash(ck)==hash(k1)</code>,</li>
  741. </ol>
  742. for every <code>c_hash</code> of type <code>CompatibleHash</code>,
  743. <code>c_eq</code> of type <code>CompatiblePred</code>,
  744. <code>hash</code> of type <code>Hash</code>,
  745. <code>eq</code> of type <code>Pred</code>, <code>ck</code> of type
  746. <code>CompatibleKey</code> and <code>k1</code>, <code>k2</code> of type
  747. <code>Key</code>.
  748. </p>
  749. <p>Additionally, a type <code>CompatibleKey</code> is said to be a
  750. <i>compatible key</i> of (<code>Hash</code>, <code>Pred</code>) if
  751. (<code>CompatibleKey</code>, <code>Hash</code>, <code>Pred</code>)
  752. is a compatible extension of (<code>Hash</code>, <code>Pred</code>).
  753. This implies that <code>Hash</code> and <code>Pred</code> accept arguments
  754. of type <code>CompatibleKey</code>, which usually means they have
  755. several overloads of their corresponding <code>operator()</code>
  756. member functions.
  757. </p>
  758. <p>
  759. In the context of a compatible extension or a compatible key, the expression
  760. "equivalent key" takes on its obvious interpretation.
  761. </p>
  762. <code>template&lt;typename CompatibleKey> iterator find(const CompatibleKey&amp; x)const;
  763. </code>
  764. <blockquote>
  765. <b>Requires:</b> <code>CompatibleKey</code> is a compatible key of
  766. (<code>hasher</code>, <code>key_equal</code>).<br>
  767. <b>Effects:</b> Returns a pointer to an element whose key is equivalent to
  768. <code>x</code>, or <code>end()</code> if such an element does not exist.<br>
  769. <b>Complexity:</b> Average case <code>O(1)</code> (constant), worst case
  770. <code>O(n<sub>dist</sub>)</code>.<br>
  771. </blockquote>
  772. <code>template&lt;<br>
  773. &nbsp;&nbsp;typename CompatibleKey,typename CompatibleHash, typename CompatiblePred<br>
  774. &gt;<br>
  775. iterator find(<br>
  776. &nbsp;&nbsp;const CompatibleKey&amp; x,<br>
  777. &nbsp;&nbsp;const CompatibleHash&amp; hash,const CompatiblePred&amp; eq)const;
  778. </code>
  779. <blockquote>
  780. <b>Requires:</b> (<code>CompatibleKey</code>, <code>CompatibleHash</code>,
  781. <code>CompatiblePred</code>) is a compatible extension of
  782. (<code>hasher</code>, <code>key_equal</code>).<br>
  783. <b>Effects:</b> Returns a pointer to an element whose key is equivalent to
  784. <code>x</code>, or <code>end()</code> if such an element does not exist.<br>
  785. <b>Complexity:</b> Average case <code>O(1)</code> (constant), worst case
  786. <code>O(n<sub>dist</sub>)</code>.<br>
  787. </blockquote>
  788. <code>template&lt;typename CompatibleKey><br>
  789. size_type count(const CompatibleKey&amp; x)const;
  790. </code>
  791. <blockquote>
  792. <b>Requires:</b> <code>CompatibleKey</code> is a compatible key of
  793. (<code>hasher</code>, <code>key_equal</code>).<br>
  794. <b>Effects:</b> Returns the number of elements with key equivalent to <code>x</code>.<br>
  795. <b>Complexity:</b> Average case <code>O(count(x))</code>, worst case
  796. <code>O(count(x)+n<sub>dist</sub>)</code>.<br>
  797. </blockquote>
  798. <code>template&lt;<br>
  799. &nbsp;&nbsp;typename CompatibleKey,typename CompatibleHash, typename CompatiblePred<br>
  800. &gt;<br>
  801. size_type count(<br>
  802. &nbsp;&nbsp;const CompatibleKey&amp; x,<br>
  803. &nbsp;&nbsp;const CompatibleHash&amp; hash,const CompatiblePred&amp; eq)const;
  804. </code>
  805. <blockquote>
  806. <b>Requires:</b> (<code>CompatibleKey</code>, <code>CompatibleHash</code>,
  807. <code>CompatiblePred</code>) is a compatible extension of
  808. (<code>hasher</code>, <code>key_equal</code>).<br>
  809. <b>Effects:</b> Returns the number of elements with key equivalent to <code>x</code>.<br>
  810. <b>Complexity:</b> Average case <code>O(count(x,hash,eq))</code>, worst case
  811. <code>O(count(x,hash,eq)+n<sub>dist</sub>)</code>.<br>
  812. </blockquote>
  813. <code>template&lt;typename CompatibleKey><br>
  814. std::pair&lt;iterator,iterator> equal_range(const CompatibleKey&amp; x)const;
  815. </code>
  816. <blockquote>
  817. <b>Requires:</b> <code>CompatibleKey</code> is a compatible key of
  818. (<code>hasher</code>, <code>key_equal</code>).<br>
  819. <b>Effects:</b> Returns a range containing all elements with keys equivalent
  820. to <code>x</code> (and only those), or (<code>end()</code>,<code>end()</code>)
  821. if no such elements exist.<br>
  822. <b>Complexity:</b> Average case <code>O(1)</code> (constant), worst case
  823. <code>O(n<sub>dist</sub>)</code>.<br>
  824. </blockquote>
  825. <code>template&lt;<br>
  826. &nbsp;&nbsp;typename CompatibleKey,typename CompatibleHash, typename CompatiblePred<br>
  827. &gt;<br>
  828. std::pair&lt;iterator,iterator> equal_range(<br>
  829. &nbsp;&nbsp;const CompatibleKey&amp; x,<br>
  830. &nbsp;&nbsp;const CompatibleHash&amp; hash,const CompatiblePred&amp; eq)const;
  831. </code>
  832. <blockquote>
  833. <b>Requires:</b> (<code>CompatibleKey</code>, <code>CompatibleHash</code>,
  834. <code>CompatiblePred</code>) is a compatible extension of
  835. (<code>hasher</code>, <code>key_equal</code>).<br>
  836. <b>Effects:</b> Returns a range containing all elements with keys equivalent
  837. to <code>x</code> (and only those), or (<code>end()</code>,<code>end()</code>)
  838. if no such elements exist.<br>
  839. <b>Complexity:</b> Average case <code>O(1)</code> (constant), worst case
  840. <code>O(n<sub>dist</sub>)</code>.<br>
  841. </blockquote>
  842. <h4><a name="bucket_interface">Bucket interface</a></h4>
  843. <code>local_iterator&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;local_iterator_to(const value_type&amp; x);<br>
  844. const_local_iterator local_iterator_to(const value_type&amp; x)const;</code>
  845. <blockquote>
  846. <b>Requires:</b> <code>x</code> is a reference to an element of the container.<br>
  847. <b>Returns:</b> An iterator to <code>x</code>.<br>
  848. <b>Complexity:</b> Constant.<br>
  849. <b>Exception safety:</b> <code>nothrow</code>.<br>
  850. </blockquote>
  851. <h4><a name="hash_policy">Hash policy</a></h4>
  852. <code>void rehash(size_type n);</code>
  853. <blockquote>
  854. <b>Effects:</b> Increases if necessary the number of internal buckets
  855. so that <code>size()/bucket_count()</code> does not exceed the maximum
  856. load factor, and <code>bucket_count()>=n</code>.<br>
  857. <b>Postconditions:</b> Validity of iterators and references to the
  858. elements contained is preserved.<br>
  859. <b>Complexity:</b> <code>O(m)</code>, where <code>m</code> is the number of
  860. non-equivalent elements in the index.<br>
  861. <b>Exception safety:</b> Strong.
  862. </blockquote>
  863. <code>void reserve(size_type n);</code>
  864. <blockquote>
  865. <b>Effects:</b>
  866. <blockquote><pre>
  867. <span class=identifier>rehash</span><span class=special>(</span><span class=identifier>std</span><span class=special>::</span><span class=identifier>ceil</span><span class=special>(</span><span class=identifier>n</span><span class=special>/</span><span class=identifier>max_load_factor</span><span class=special>()));</span>
  868. </pre></blockquote>
  869. </blockquote>
  870. <h4><a name="comparison">Comparison</a></h4>
  871. <code>template&lt;<i>implementation defined</i>&gt;<br>
  872. bool operator==(const <i>index class name</i>&amp; x,const <i>index class name</i>&amp; y);</code>
  873. <blockquote>
  874. <b>Requires:</b> <code>x.key_extractor()</code>, <code>x.hash_function()</code> and
  875. <code>x.key_eq()</code> have the same behavior as the corresponding objects in <code>y</code>.
  876. For any two elements <code>e1</code>, <code>e2</code> in <code>x</code> or <code>y</code>,
  877. if <code>e1==e2</code> then their keys are equivalent.<br>
  878. <b>Returns:</b> <code>true</code> iff <code>x</code> and <code>y</code> have the same size
  879. and for each key <code>k</code> present in <code>x</code> the range
  880. <code>x.equal_range(k)</code> is equal (considering the <code>==</code> operator of <code>value_type</code>)
  881. to <code>y.equal_range(k)</code> under permutations of the elements.<br>
  882. <b>Complexity:</b> Let <code>k<sub>1</sub></code>,...,<code>k<sub>m</sub></code> be the different
  883. keys present in <code>x</code>:<br>
  884. <ul>
  885. <li>If, for each <code>k<sub>i</sub></code>, <code>x.equal_range(k<sub>i</sub>)</code> is arranged
  886. in the same order as <code>y.equal_range(k<sub>i</sub>)</code>, average case is
  887. <code>O(x.size())</code>, worst case <code>O(x.size()<sup>2</sup>)</code>.
  888. </li>
  889. <li>Otherwise, average case is
  890. <code>O(<font style="font-size:1.5em">&Sigma;</font>(x.count(k<sub>i</sub>)<sup>2</sup>))</code>,
  891. worst case <code>O(x.size()<sup>2</sup>)</code>.
  892. </li>
  893. </ul>
  894. (For unique indices, the formulas above reduce to average case
  895. <code>O(x.size())</code>, worst case <code>O(x.size()<sup>2</sup>)</code>.)
  896. </blockquote>
  897. <h4><a name="serialization">Serialization</a></h4>
  898. <p>
  899. Indices cannot be serialized on their own, but only as part of the
  900. <code>multi_index_container</code> into which they are embedded. In describing
  901. the additional preconditions and guarantees associated to hashed indices
  902. with respect to serialization of their embedding containers, we
  903. use the concepts defined in the <code>multi_index_container</code>
  904. <a href="multi_index_container.html#serialization">serialization section</a>.
  905. </p>
  906. Operation: saving of a <code>multi_index_container</code> <code>m</code> to an
  907. output archive (XML archive) <code>ar</code>.
  908. <blockquote>
  909. <b>Requires:</b> No additional requirements to those imposed by the container.
  910. </blockquote>
  911. Operation: loading of a <code>multi_index_container</code> <code>m'</code> from an
  912. input archive (XML archive) <code>ar</code>.
  913. <blockquote>
  914. <b>Requires:</b> Additionally to the general requirements, <code>key_eq()</code>
  915. must be serialization-compatible with <code>m.get&lt;i&gt;().key_eq()</code>,
  916. where <code>i</code> is the position of the hashed index in the container.<br>
  917. <b>Postconditions:</b> On successful loading, the range
  918. [<code>begin()</code>, <code>end()</code>) contains restored copies of every
  919. element in [<code>m.get&lt;i&gt;().begin()</code>, <code>m.get&lt;i&gt;().end()</code>),
  920. though not necessarily in the same order.
  921. </blockquote>
  922. Operation: saving of an <code>iterator</code> or <code>const_iterator</code>
  923. <code>it</code> to an output archive (XML archive) <code>ar</code>.
  924. <blockquote>
  925. <b>Requires:</b> <code>it</code> is a valid iterator of the index. The associated
  926. <code>multi_index_container</code> has been previously saved.
  927. </blockquote>
  928. Operation: loading of an <code>iterator</code> or <code>const_iterator</code>
  929. <code>it'</code> from an input archive (XML archive) <code>ar</code>.
  930. <blockquote>
  931. <b>Postconditions:</b> On successful loading, if <code>it</code> was dereferenceable
  932. then <code>*it'</code> is the restored copy of <code>*it</code>, otherwise
  933. <code>it'==end()</code>.<br>
  934. <b>Note:</b> It is allowed that <code>it</code> be a <code>const_iterator</code>
  935. and the restored <code>it'</code> an <code>iterator</code>, or vice versa.
  936. </blockquote>
  937. Operation: saving of a <code>local_iterator</code> or
  938. <code>const_local_iterator</code>
  939. <code>it</code> to an output archive (XML archive) <code>ar</code>.
  940. <blockquote>
  941. <b>Requires:</b> <code>it</code> is a valid local iterator of the index. The
  942. associated <code>multi_index_container</code> has been previously saved.
  943. </blockquote>
  944. Operation: loading of a <code>local_iterator</code> or
  945. <code>const_local_iterator</code>
  946. <code>it'</code> from an input archive (XML archive) <code>ar</code>.
  947. <blockquote>
  948. <b>Postconditions:</b> On successful loading, if <code>it</code> was dereferenceable
  949. then <code>*it'</code> is the restored copy of <code>*it</code>; if <code>it</code>
  950. was <code>m.get&lt;i&gt;().end(n)</code> for some <code>n</code>, then
  951. <code>it'==m'.get&lt;i&gt;().end(n)</code> (where <code>m</code> is the original
  952. <code>multi_index_container</code>, <code>m'</code> its restored copy
  953. and <code>i</code> is the ordinal of the index.)<br>
  954. <b>Note:</b> It is allowed that <code>it</code> be a <code>const_local_iterator</code>
  955. and the restored <code>it'</code> a <code>local_iterator</code>, or vice versa.
  956. </blockquote>
  957. <hr>
  958. <div class="prev_link"><a href="rnk_indices.html"><img src="../prev.gif" alt="ranked indices" border="0"><br>
  959. Ranked indices
  960. </a></div>
  961. <div class="up_link"><a href="index.html"><img src="../up.gif" alt="Boost.MultiIndex reference" border="0"><br>
  962. Boost.MultiIndex reference
  963. </a></div>
  964. <div class="next_link"><a href="seq_indices.html"><img src="../next.gif" alt="sequenced indices" border="0"><br>
  965. Sequenced indices
  966. </a></div><br clear="all" style="clear: all;">
  967. <br>
  968. <p>Revised August 25th 2017</p>
  969. <p>&copy; Copyright 2003-2017 Joaqu&iacute;n M L&oacute;pez Mu&ntilde;oz.
  970. Distributed under the Boost Software
  971. License, Version 1.0. (See accompanying file <a href="../../../../LICENSE_1_0.txt">
  972. LICENSE_1_0.txt</a> or copy at <a href="http://www.boost.org/LICENSE_1_0.txt">
  973. http://www.boost.org/LICENSE_1_0.txt</a>)
  974. </p>
  975. </body>
  976. </html>