<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang xml:lang>
<head>
  <meta charset="utf-8" />
  <meta name="generator" content="mpark/wg21" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
  <meta name="dcterms.date" content="2023-10-15" />
  <title>std::hive and containers like it are not a good fit for the
standard library</title>
  <style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
span.underline{text-decoration: underline;}
div.column{display: inline-block; vertical-align: top; width: 50%;}
div.csl-block{margin-left: 1.5em;}
ul.task-list{list-style: none;}
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ background-color: #f6f8fa; }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span { } 
code span.al { color: #ff0000; } 
code span.an { } 
code span.at { } 
code span.bn { color: #9f6807; } 
code span.bu { color: #9f6807; } 
code span.cf { color: #00607c; } 
code span.ch { color: #9f6807; } 
code span.cn { } 
code span.co { color: #008000; font-style: italic; } 
code span.cv { color: #008000; font-style: italic; } 
code span.do { color: #008000; } 
code span.dt { color: #00607c; } 
code span.dv { color: #9f6807; } 
code span.er { color: #ff0000; font-weight: bold; } 
code span.ex { } 
code span.fl { color: #9f6807; } 
code span.fu { } 
code span.im { } 
code span.in { color: #008000; } 
code span.kw { color: #00607c; } 
code span.op { color: #af1915; } 
code span.ot { } 
code span.pp { color: #6f4e37; } 
code span.re { } 
code span.sc { color: #9f6807; } 
code span.ss { color: #9f6807; } 
code span.st { color: #9f6807; } 
code span.va { } 
code span.vs { color: #9f6807; } 
code span.wa { color: #008000; font-weight: bold; } 
code.diff {color: #898887}
code.diff span.va {color: #006e28}
code.diff span.st {color: #bf0303}
</style>
  <style type="text/css">
body {
margin: 5em;
font-family: serif;

hyphens: auto;
line-height: 1.35;
text-align: justify;
}
@media screen and (max-width: 30em) {
body {
margin: 1.5em;
}
}
div.wrapper {
max-width: 60em;
margin: auto;
}
ul {
list-style-type: none;
padding-left: 2em;
margin-top: -0.2em;
margin-bottom: -0.2em;
}
a {
text-decoration: none;
color: #4183C4;
}
a.hidden_link {
text-decoration: none;
color: inherit;
}
li {
margin-top: 0.6em;
margin-bottom: 0.6em;
}
h1, h2, h3, h4 {
position: relative;
line-height: 1;
}
a.self-link {
position: absolute;
top: 0;
left: calc(-1 * (3.5rem - 26px));
width: calc(3.5rem - 26px);
height: 2em;
text-align: center;
border: none;
transition: opacity .2s;
opacity: .5;
font-family: sans-serif;
font-weight: normal;
font-size: 83%;
}
a.self-link:hover { opacity: 1; }
a.self-link::before { content: "§"; }
ul > li:before {
content: "\2014";
position: absolute;
margin-left: -1.5em;
}
:target { background-color: #C9FBC9; }
:target .codeblock { background-color: #C9FBC9; }
:target ul { background-color: #C9FBC9; }
.abbr_ref { float: right; }
.folded_abbr_ref { float: right; }
:target .folded_abbr_ref { display: none; }
:target .unfolded_abbr_ref { float: right; display: inherit; }
.unfolded_abbr_ref { display: none; }
.secnum { display: inline-block; min-width: 35pt; }
.header-section-number { display: inline-block; min-width: 35pt; }
.annexnum { display: block; }
div.sourceLinkParent {
float: right;
}
a.sourceLink {
position: absolute;
opacity: 0;
margin-left: 10pt;
}
a.sourceLink:hover {
opacity: 1;
}
a.itemDeclLink {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
opacity: 0;
}
a.itemDeclLink:hover { opacity: 1; }
span.marginalizedparent {
position: relative;
left: -5em;
}
li span.marginalizedparent { left: -7em; }
li ul > li span.marginalizedparent { left: -9em; }
li ul > li ul > li span.marginalizedparent { left: -11em; }
li ul > li ul > li ul > li span.marginalizedparent { left: -13em; }
div.footnoteNumberParent {
position: relative;
left: -4.7em;
}
a.marginalized {
position: absolute;
font-size: 75%;
text-align: right;
width: 5em;
}
a.enumerated_item_num {
position: relative;
left: -3.5em;
display: inline-block;
margin-right: -3em;
text-align: right;
width: 3em;
}
div.para { margin-bottom: 0.6em; margin-top: 0.6em; text-align: justify; }
div.section { text-align: justify; }
div.sentence { display: inline; }
span.indexparent {
display: inline;
position: relative;
float: right;
right: -1em;
}
a.index {
position: absolute;
display: none;
}
a.index:before { content: "⟵"; }

a.index:target {
display: inline;
}
.indexitems {
margin-left: 2em;
text-indent: -2em;
}
div.itemdescr {
margin-left: 3em;
}
.bnf {
font-family: serif;
margin-left: 40pt;
margin-top: 0.5em;
margin-bottom: 0.5em;
}
.ncbnf {
font-family: serif;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
}
.ncsimplebnf {
font-family: serif;
font-style: italic;
margin-top: 0.5em;
margin-bottom: 0.5em;
margin-left: 40pt;
background: inherit; 
}
span.textnormal {
font-style: normal;
font-family: serif;
white-space: normal;
display: inline-block;
}
span.rlap {
display: inline-block;
width: 0px;
}
span.descr { font-style: normal; font-family: serif; }
span.grammarterm { font-style: italic; }
span.term { font-style: italic; }
span.terminal { font-family: monospace; font-style: normal; }
span.nonterminal { font-style: italic; }
span.tcode { font-family: monospace; font-style: normal; }
span.textbf { font-weight: bold; }
span.textsc { font-variant: small-caps; }
a.nontermdef { font-style: italic; font-family: serif; }
span.emph { font-style: italic; }
span.techterm { font-style: italic; }
span.mathit { font-style: italic; }
span.mathsf { font-family: sans-serif; }
span.mathrm { font-family: serif; font-style: normal; }
span.textrm { font-family: serif; }
span.textsl { font-style: italic; }
span.mathtt { font-family: monospace; font-style: normal; }
span.mbox { font-family: serif; font-style: normal; }
span.ungap { display: inline-block; width: 2pt; }
span.textit { font-style: italic; }
span.texttt { font-family: monospace; }
span.tcode_in_codeblock { font-family: monospace; font-style: normal; }
span.phantom { color: white; }

span.math { font-style: normal; }
span.mathblock {
display: block;
margin-left: auto;
margin-right: auto;
margin-top: 1.2em;
margin-bottom: 1.2em;
text-align: center;
}
span.mathalpha {
font-style: italic;
}
span.synopsis {
font-weight: bold;
margin-top: 0.5em;
display: block;
}
span.definition {
font-weight: bold;
display: block;
}
.codeblock {
margin-left: 1.2em;
line-height: 127%;
}
.outputblock {
margin-left: 1.2em;
line-height: 127%;
}
div.itemdecl {
margin-top: 2ex;
}
code.itemdeclcode {
white-space: pre;
display: block;
}
span.textsuperscript {
vertical-align: super;
font-size: smaller;
line-height: 0;
}
.footnotenum { vertical-align: super; font-size: smaller; line-height: 0; }
.footnote {
font-size: small;
margin-left: 2em;
margin-right: 2em;
margin-top: 0.6em;
margin-bottom: 0.6em;
}
div.minipage {
display: inline-block;
margin-right: 3em;
}
div.numberedTable {
text-align: center;
margin: 2em;
}
div.figure {
text-align: center;
margin: 2em;
}
table {
border: 1px solid black;
border-collapse: collapse;
margin-left: auto;
margin-right: auto;
margin-top: 0.8em;
text-align: left;
hyphens: none; 
}
td, th {
padding-left: 1em;
padding-right: 1em;
vertical-align: top;
}
td.empty {
padding: 0px;
padding-left: 1px;
}
td.left {
text-align: left;
}
td.right {
text-align: right;
}
td.center {
text-align: center;
}
td.justify {
text-align: justify;
}
td.border {
border-left: 1px solid black;
}
tr.rowsep, td.cline {
border-top: 1px solid black;
}
tr.even, tr.odd {
border-bottom: 1px solid black;
}
tr.capsep {
border-top: 3px solid black;
border-top-style: double;
}
tr.header {
border-bottom: 3px solid black;
border-bottom-style: double;
}
th {
border-bottom: 1px solid black;
}
span.centry {
font-weight: bold;
}
div.table {
display: block;
margin-left: auto;
margin-right: auto;
text-align: center;
width: 90%;
}
span.indented {
display: block;
margin-left: 2em;
margin-bottom: 1em;
margin-top: 1em;
}
ol.enumeratea { list-style-type: none; background: inherit; }
ol.enumerate { list-style-type: none; background: inherit; }

code.sourceCode > span { display: inline; }
</style>
  <link href="data:image/vnd.microsoft.icon;base64,AAABAAIAEBAAAAEAIABoBAAAJgAAACAgAAABACAAqBAAAI4EAAAoAAAAEAAAACAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAVoJEAN6CRADegkQAWIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wCCRAAAgkQAAIJEAACCRAAsgkQAvoJEAP+CRAD/gkQA/4JEAP+CRADAgkQALoJEAACCRAAAgkQAAP///wD///8AgkQAAIJEABSCRACSgkQA/IJEAP99PQD/dzMA/3czAP99PQD/gkQA/4JEAPyCRACUgkQAFIJEAAD///8A////AHw+AFiBQwDqgkQA/4BBAP9/PxP/uZd6/9rJtf/bybX/upd7/39AFP+AQQD/gkQA/4FDAOqAQgBc////AP///wDKklv4jlEa/3o7AP+PWC//8+3o///////////////////////z7un/kFox/35AAP+GRwD/mVYA+v///wD///8A0Zpk+NmibP+0d0T/8evj///////+/fv/1sKz/9bCs//9/fr//////+/m2/+NRwL/nloA/5xYAPj///8A////ANKaZPjRmGH/5cKh////////////k149/3UwAP91MQD/lmQ//86rhv+USg3/m1YA/5hSAP+bVgD4////AP///wDSmmT4zpJY/+/bx///////8+TV/8mLT/+TVx//gkIA/5lVAP+VTAD/x6B//7aEVv/JpH7/s39J+P///wD///8A0ppk+M6SWP/u2sf///////Pj1f/Nj1T/2KFs/8mOUv+eWhD/lEsA/8aee/+0glT/x6F7/7J8Rvj///8A////ANKaZPjRmGH/48Cf///////+/v7/2qt//82PVP/OkFX/37KJ/86siv+USg7/mVQA/5hRAP+bVgD4////AP///wDSmmT40ppk/9CVXP/69O////////7+/v/x4M//8d/P//7+/f//////9u7n/6tnJf+XUgD/nFgA+P///wD///8A0ppk+NKaZP/RmWL/1qNy//r07///////////////////////+vXw/9akdP/Wnmn/y5FY/6JfFvj///8A////ANKaZFTSmmTo0ppk/9GYYv/Ql1//5cWm//Hg0P/x4ND/5cWm/9GXYP/RmGH/0ppk/9KaZOjVnmpY////AP///wDSmmQA0ppkEtKaZI7SmmT60ppk/9CWX//OkVb/zpFW/9CWX//SmmT/0ppk/NKaZJDSmmQS0ppkAP///wD///8A0ppkANKaZADSmmQA0ppkKtKaZLrSmmT/0ppk/9KaZP/SmmT/0ppkvNKaZCrSmmQA0ppkANKaZAD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkUtKaZNzSmmTc0ppkVNKaZADSmmQA0ppkANKaZADSmmQA////AP5/AAD4HwAA4AcAAMADAACAAQAAgAEAAIABAACAAQAAgAEAAIABAACAAQAAgAEAAMADAADgBwAA+B8AAP5/AAAoAAAAIAAAAEAAAAABACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAyCRACMgkQA6oJEAOqCRACQgkQAEIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRABigkQA5oJEAP+CRAD/gkQA/4JEAP+CRADqgkQAZoJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAA4gkQAwoJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQAxIJEADyCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAAgkQAAP///wD///8A////AP///wCCRAAAgkQAAIJEAACCRAAAgkQAAIJEAACCRAAWgkQAmIJEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAJyCRAAYgkQAAIJEAACCRAAAgkQAAIJEAACCRAAA////AP///wD///8A////AIJEAACCRAAAgkQAAIJEAACCRAAAgkQAdIJEAPCCRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAP+CRAD/gkQA/4JEAPSCRAB4gkQAAIJEAACCRAAAgkQAAIJEAAD///8A////AP///wD///8AgkQAAIJEAACCRAAAgkQASoJEANKCRAD/gkQA/4JEAP+CRAD/g0YA/39AAP9zLgD/bSQA/2shAP9rIQD/bSQA/3MuAP9/PwD/g0YA/4JEAP+CRAD/gkQA/4JEAP+CRADUgkQAToJEAACCRAAAgkQAAP///wD///8A////AP///wB+PwAAgkUAIoJEAKiCRAD/gkQA/4JEAP+CRAD/hEcA/4BBAP9sIwD/dTAA/5RfKv+viF7/vp56/76ee/+wiF7/lWAr/3YxAP9sIwD/f0AA/4RHAP+CRAD/gkQA/4JEAP+CRAD/gkQArIJEACaBQwAA////AP///wD///8A////AIBCAEBzNAD6f0EA/4NFAP+CRAD/gkQA/4VIAP92MwD/bSUA/6N1Tv/ezsL/////////////////////////////////38/D/6V3Uv9uJgD/dTEA/4VJAP+CRAD/gkQA/4JEAP+BQwD/fUAA/4FDAEj///8A////AP///wD///8AzJRd5qBlKf91NgD/dDUA/4JEAP+FSQD/cy4A/3YyAP/PuKP//////////////////////////////////////////////////////9K7qP94NQD/ciwA/4VJAP+CRAD/fkEA/35BAP+LSwD/mlYA6v///wD///8A////AP///wDdpnL/4qx3/8KJUv+PUhf/cTMA/3AsAP90LgD/4dK+/////////////////////////////////////////////////////////////////+TYxf91MAD/dTIA/31CAP+GRwD/llQA/6FcAP+gWwD8////AP///wD///8A////ANGZY/LSm2X/4ap3/92mcP+wdT3/byQA/8mwj////////////////////////////////////////////////////////////////////////////+LYxv9zLgP/jUoA/59bAP+hXAD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/RmWL/1p9q/9ubXv/XqXj////////////////////////////7+fD/vZyG/6BxS/+gcUr/vJuE//r37f//////////////////////3MOr/5dQBf+dVQD/nVkA/5xYAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmWP/yohJ//jo2P//////////////////////4NTG/4JDFf9lGAD/bSQA/20kAP9kGAD/fz8S/+Xb0f//////5NG9/6txN/+LOgD/m1QA/51aAP+cWAD/m1cA/5xYAP+cWADy////AP///wD///8A////ANKaZPLSmmT/0ppk/8+TWf/Unmv//v37//////////////////////+TWRr/VwsA/35AAP+ERgD/g0UA/4JGAP9lHgD/kFga/8KXX/+TRwD/jT4A/49CAP+VTQD/n10A/5xYAP+OQQD/lk4A/55cAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/y4tO/92yiP//////////////////////8NnE/8eCQP+rcTT/ez0A/3IyAP98PgD/gEMA/5FSAP+USwD/jj8A/5lUAP+JNwD/yqV2/694Mf+HNQD/jkAA/82rf/+laBj/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/LiUr/4byY///////////////////////gupX/0I5P/+Wuev/Lklz/l1sj/308AP+QSwD/ol0A/59aAP+aVQD/k0oA/8yoh///////+fXv/6pwO//Lp3v///////Pr4f+oay7y////AP///wD///8A////ANKaZPLSmmT/0ppk/8uJSv/hvJj//////////////////////+G7l//Jhkb/0ppk/96nc//fqXX/x4xO/6dkFP+QSQD/llEA/5xXAP+USgD/yaOA///////38uv/qG05/8ijdv//////8efb/6ZpLPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/zIxO/9yxh///////////////////////7dbA/8iEQf/Sm2X/0Zlj/9ScZv/eqHf/2KJv/7yAQf+XTgD/iToA/5lSAP+JNgD/yKFv/611LP+HNQD/jT8A/8qmeP+kZRT/jT4A8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/Pk1n/1J5q//78+//////////////////+/fv/1aFv/8iEQv/Tm2b/0ppl/9GZY//Wn2z/1pZc/9eldf/Bl2b/kUcA/4w9AP+OQAD/lUwA/59eAP+cWQD/jT8A/5ZOAP+eXADy////AP///wD///8A////ANKaZPLSmmT/0ppk/9KZY//KiEn/8d/P///////////////////////47+f/05tm/8iCP//KiEj/yohJ/8eCP//RmGH//vfy///////n1sP/rXQ7/4k4AP+TTAD/nVoA/5xYAP+cVwD/nFgA/5xYAPL///8A////AP///wD///8A0ppk8tKaZP/SmmT/0ptl/8uLTf/aq37////////////////////////////+/fz/6c2y/961jv/etY7/6Myx//78+v//////////////////////3MWv/5xXD/+ORAD/mFQA/51ZAP+cWAD/nFgA8v///wD///8A////AP///wDSmmTy0ppk/9KaZP/SmmT/0ppk/8mFRP/s1b//////////////////////////////////////////////////////////////////////////////+PD/0JFU/7NzMv+WUQD/kUsA/5tXAP+dWQDy////AP///wD///8A////ANKaZP/SmmT/0ppk/9KaZP/Sm2X/z5NZ/8yMT//z5NX/////////////////////////////////////////////////////////////////9Ofa/8yNUP/UmGH/36p5/8yTWv+qaSD/kksA/5ROAPz///8A////AP///wD///8A0ppk5NKaZP/SmmT/0ppk/9KaZP/TnGf/zY9T/82OUv/t1sD//////////////////////////////////////////////////////+7Yw//OkFX/zI5R/9OcZ//SmmP/26V0/9ymdf/BhUf/ol8R6P///wD///8A////AP///wDSmmQ80ppk9tKaZP/SmmT/0ppk/9KaZP/TnGj/zpFW/8qJSv/dson/8uHS//////////////////////////////////Lj0//etIv/y4lL/86QVf/TnGj/0ppk/9KaZP/RmWP/05xn/9ymdfjUnWdC////AP///wD///8A////ANKaZADSmmQc0ppkotKaZP/SmmT/0ppk/9KaZP/Tm2b/0Zli/8qJSf/NjlH/16Z3/+G8mP/myKr/5siq/+G8mP/Xp3f/zY5S/8qISf/RmGH/05tm/9KaZP/SmmT/0ppk/9KaZP/SmmSm0pljINWdaQD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkQtKaZMrSmmT/0ppk/9KaZP/SmmT/0ptl/9GYYf/Nj1P/y4lL/8qISP/KiEj/y4lK/82PU//RmGH/0ptl/9KaZP/SmmT/0ppk/9KaZP/SmmTO0ppkRtKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZGzSmmTu0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmTw0ppkcNKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZBLSmmSQ0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppklNKaZBTSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP///wD///8A0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQy0ppkutKaZP/SmmT/0ppk/9KaZP/SmmT/0ppk/9KaZP/SmmT/0ppkvtKaZDbSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkAP///wD///8A////AP///wDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkXNKaZODSmmT/0ppk/9KaZP/SmmT/0ppk5NKaZGDSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA////AP///wD///8A////ANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkBtKaZIbSmmTo0ppk6tKaZIrSmmQK0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZADSmmQA0ppkANKaZAD///8A////AP/8P///+B///+AH//+AAf//AAD//AAAP/AAAA/gAAAHwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA8AAAAPAAAADwAAAA+AAAAfwAAAP/AAAP/8AAP//gAH//+AH///4H////D//" rel="icon" />
  
  <!--[if lt IE 9]>
    <script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
  <![endif]-->
</head>
<body>
<div class="wrapper">
<header id="title-block-header">
<h1 class="title" style="text-align:center">std::hive and containers
like it are not a good fit for the standard library</h1>
<table style="border:none;float:right">
  <tr>
    <td>Document #:</td>
    <td>P3001R0</td>
  </tr>
  <tr>
    <td>Date:</td>
    <td>2023-10-15</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Project:</td>
    <td>Programming Language C++</td>
  </tr>
  <tr>
    <td style="vertical-align:top">Audience:</td>
    <td>
      LEWG<br>
    </td>
  </tr>
  <tr>
    <td style="vertical-align:top">Reply-to:</td>
    <td>
      Jonathan Müller<br>&lt;<a href="mailto:foonathan@jonathanmueller.dev" class="email">foonathan@jonathanmueller.dev</a>&gt;<br>
      Zach Laine<br>&lt;<a href="mailto:whatwasthataddress@gmail.com" class="email">whatwasthataddress@gmail.com</a>&gt;<br>
      Bryce Adelstein Lelbach<br>&lt;<a href="mailto:brycelelbach@gmail.com" class="email">brycelelbach@gmail.com</a>&gt;<br>
      David Sankel<br>&lt;<a href="mailto:dsankel@adobe.com" class="email">dsankel@adobe.com</a>&gt;<br>
    </td>
  </tr>
</table>
</header>
<div style="clear:both">
<div id="TOC" role="doc-toc">
<h1 id="toctitle">Contents</h1>
<ul>
<li><a href="#abstract" id="toc-abstract"><span class="toc-section-number">1</span> Abstract</a></li>
<li><a href="#introduction" id="toc-introduction"><span class="toc-section-number">2</span> Introduction</a></li>
<li><a href="#what-the-c-standard-library-is-good-at" id="toc-what-the-c-standard-library-is-good-at"><span class="toc-section-number">3</span> What the C++ standard library is
good at</a>
<ul>
<li><a href="#types-and-functions-requiring-compiler-intrinsics" id="toc-types-and-functions-requiring-compiler-intrinsics"><span class="toc-section-number">3.1</span> Types and functions requiring
compiler intrinsics</a></li>
<li><a href="#core-vocabulary-types" id="toc-core-vocabulary-types"><span class="toc-section-number">3.2</span> Core vocabulary types</a></li>
<li><a href="#cross-platform-os-abstractions" id="toc-cross-platform-os-abstractions"><span class="toc-section-number">3.3</span> Cross-platform OS
abstractions</a></li>
<li><a href="#fundamental-algorithms-and-data-structures" id="toc-fundamental-algorithms-and-data-structures"><span class="toc-section-number">3.4</span> Fundamental algorithms and data
structures</a></li>
</ul></li>
<li><a href="#limitations-of-standardized-libraries" id="toc-limitations-of-standardized-libraries"><span class="toc-section-number">4</span> Limitations of standardized
libraries</a></li>
<li><a href="#high-performance-containers-and-the-c-standard-library" id="toc-high-performance-containers-and-the-c-standard-library"><span class="toc-section-number">5</span> High-performance containers and the
C++ standard library</a></li>
<li><a href="#stdhive-and-the-c-standard-library" id="toc-stdhive-and-the-c-standard-library"><span class="toc-section-number">6</span>
<code class="sourceCode default">std::hive</code> and the C++ standard
library</a></li>
<li><a href="#bibliography" id="toc-bibliography"><span class="toc-section-number">7</span> References</a></li>
</ul>
</div>
<h1 data-number="1" id="abstract"><span class="header-section-number">1</span> Abstract<a href="#abstract" class="self-link"></a></h1>
<p>The high-performance
<code class="sourceCode default">std::hive</code> container is proposed
for inclusion in the C++ standard. While the reference implementation is
useful in many contexts, it is yet unclear whether standardization of
its interface it appropriate. This paper attempts to answer this
question by capturing the characteristics of successful standardized
libraries and considering the unique requirements of high-performance
containers. We conclude that evolutionary limitations and high
standardization costs make standardization of libraries such as
<code class="sourceCode default">std::hive</code> undesirable.</p>
<h1 data-number="2" id="introduction"><span class="header-section-number">2</span> Introduction<a href="#introduction" class="self-link"></a></h1>
<p>At the Varna meeting, the authors raised concerns about the
appropriateness of <span class="citation" data-cites="P0447R22">[<a href="#ref-P0447R22" role="doc-biblioref">P0447R22</a>]</span>’s
<code class="sourceCode default">std::hive</code> as an addition to the
standard library. Let’s look at why we are concerned. First, let’s
discuss what should and should not go in the standard library. Then we
will argue that <code class="sourceCode default">std::hive</code> is not
a good fit.</p>
<h1 data-number="3" id="what-the-c-standard-library-is-good-at"><span class="header-section-number">3</span> What the C++ standard library is
good at<a href="#what-the-c-standard-library-is-good-at" class="self-link"></a></h1>
<p>Elements of the standard library ideally fall into one of the
following categories <span class="citation" data-cites="stdlib-bryce stdlib-titus stdlib-corentin stdlib-jonathan">[<a href="#ref-stdlib-bryce" role="doc-biblioref">stdlib-bryce</a>,<a href="#ref-stdlib-corentin" role="doc-biblioref">stdlib-corentin</a>,<a href="#ref-stdlib-jonathan" role="doc-biblioref">stdlib-jonathan</a>,<a href="#ref-stdlib-titus" role="doc-biblioref">stdlib-titus</a>]</span>:</p>
<h2 data-number="3.1" id="types-and-functions-requiring-compiler-intrinsics"><span class="header-section-number">3.1</span> Types and functions requiring
compiler intrinsics<a href="#types-and-functions-requiring-compiler-intrinsics" class="self-link"></a></h2>
<p>The standard library is the only place where we can put types and
functions that require compiler support, since it is shipped by and
often developed alongside a C++ compiler implementation. This includes
things like
<code class="sourceCode default">std::initializer_list</code>, some
<code class="sourceCode default">&lt;type_traits&gt;</code>, or
<code class="sourceCode default">std::coroutine_traits</code>.</p>
<h2 data-number="3.2" id="core-vocabulary-types"><span class="header-section-number">3.2</span> Core vocabulary types<a href="#core-vocabulary-types" class="self-link"></a></h2>
<p>C++ libraries and applications want to use user-defined types like
<code class="sourceCode default">optional</code>,
<code class="sourceCode default">span</code>, or
<code class="sourceCode default">string_view</code> to communicate
intent and provide more expressive APIs.</p>
<p>Consider <code class="sourceCode default">optional</code>. If every
library shipped with its own implementation, communication between them
would require programmer and CPU time to translate between types.
Putting an <code class="sourceCode default">optional</code>
implementation into the standard library alleviates that problem, since
all libraries can use the standard library.</p>
<h2 data-number="3.3" id="cross-platform-os-abstractions"><span class="header-section-number">3.3</span> Cross-platform OS
abstractions<a href="#cross-platform-os-abstractions" class="self-link"></a></h2>
<p>The standard library is ubiquitous and implemented by platform
experts. Most platforms provide I/O, threading, and memory allocation.
If this common OS subset is standardized, vendors can implement it for
their platforms with their expertise, and users everywhere can rely on a
simple, portable interface.</p>
<h2 data-number="3.4" id="fundamental-algorithms-and-data-structures"><span class="header-section-number">3.4</span> Fundamental algorithms and data
structures<a href="#fundamental-algorithms-and-data-structures" class="self-link"></a></h2>
<p>Some types (e.g. dynamically-allocated arrays, stacks, and queues),
and algorithms (e.g. sorting and searching), are fundamental to most or
all programming tasks. Working in C++ without
<code class="sourceCode default">vector</code> or
<code class="sourceCode default">sort</code> would be significantly more
painful than working in C++ today. The types and algorithms in this
category are needed with high enough frequency that we would not want
users to have to write them. They also have widely- and
easily-understood semantics, and <em>well-established</em>,
<em>stable</em> implementations.</p>
<aside>
They are distinct from vocabulary types, in that vocabulary types are
important for establishing conventions, whereas the entities here are
important for getting work done without reinventing those entities –
regardless of whether they are used to interoperate with other code.
</aside>
<h1 data-number="4" id="limitations-of-standardized-libraries"><span class="header-section-number">4</span> Limitations of standardized
libraries<a href="#limitations-of-standardized-libraries" class="self-link"></a></h1>
<p>For better and worse, the C++ standard library maintains a stable ABI
and API: Deviations cause significant user disruption. Proposal authors
need to be aware that as soon as something is standardized, it is
essentially done. The committee has decided against a “standard library
2.0”, so whatever facility was standardized, we have to live with
it.</p>
<p>Yes, the committee has changed the ABI of
<code class="sourceCode default">std::string</code>, deprecated and
removed egregiously wrong facilities, and recently approved a
significant number of DRs against the C++20 standard library. However,
these kind of changes are exceptional. Facilities that are bad but
insufficiently terrible like
<code class="sourceCode default">std::vector&lt;bool&gt;</code>,
<code class="sourceCode default">std::unordered_map</code>, or
<code class="sourceCode default">std::regex</code> are going to stick
around.</p>
<p>The committee thus cannot standardize facilities without an
established interface: Once standardized, a library’s API and ABI is
effectively frozen, unlike non-standard libraries which can continue to
evolve. To a lesser extent, the same is also true for its
implementation.</p>
<p>Standardizing a feature takes a lot of work, and the committee has
limited time. Everything we discuss takes time away from a different
feature and means delaying something else. The committee thus need to be
absolutely sure we want a huge feature, like graphics or networking,
before investing significant time.</p>
<p>A standardized proposal needs to be portable across all platforms and
will have multiple competing implementations of varying quality. The
committee thus needs to be careful standardizing APIs that are not
available on all platforms or where users want to rely on certain
implementation characteristics such as its performance.</p>
<h1 data-number="5" id="high-performance-containers-and-the-c-standard-library"><span class="header-section-number">5</span> High-performance containers and
the C++ standard library<a href="#high-performance-containers-and-the-c-standard-library" class="self-link"></a></h1>
<p>A high-performance container is a container implementation that is
used specifically for its runtime behavior or memory usage. Examples are
the Abseil or Boost hash tables, LLVM’s small vector implementation, or
the proposed <code class="sourceCode default">std::hive</code>. Such
containers have the following qualities:</p>
<ul>
<li>A Big O complexity better than other implementations.</li>
<li>A runtime or memory usage that is measurably better than other
implementations in the relevant micro and macro benchmarks: Switching to
a high-performance container is decided only after benchmarking
alternative implementations.</li>
<li>Need not be a vocabulary type: The cost of using a custom type for a
specific part of the API is worth it for performance.</li>
<li>Is actively maintained. CPUs continue changing, and better
algorithms are available all the time. High-performance container
implementations must adapt to those changes and keep being improved.
Otherwise, users will switch to a more modern, faster
implementation.</li>
</ul>
<p>These qualities are at odds with standardized C++ library
facilities.</p>
<p>Since high performance containers do not require compiler support or
OS APIs and are not a vocabulary types, they miss out on the core
benefits of being in the standard library. Instead, such libraries would
inherit only the downsides:</p>
<ul>
<li>Stability requirements seriously impede evolution. Simple changes
like adding additional data members are ABI breaks, and most of the
internal implementation is exposed in API guarantees like element
stability.</li>
<li>Standardization requires a significant amount of committee time that
could be spent on more appropriate additions.</li>
<li>We only standardize an interface, not an implementation: It will be
implemented by multiple vendors. Even if one implementation is good,
performance can vary between platforms. You do not have a performance
guarantee when using a standard library feature.</li>
</ul>
<p>At best, standardizing a high-performance container means it is
available without relying on external libraries. At worst, standardizing
a high-performance container takes months of committee time, ends up
with something that is already obsolete by the time it is finally
standardized, and cannot be updated due to ABI concerns.</p>
<p>How many <code class="sourceCode default">std:unordered_map</code>s
or <code class="sourceCode default">std::regex</code>es do we want in
the standard library?</p>
<h1 data-number="6" id="stdhive-and-the-c-standard-library"><span class="header-section-number">6</span>
<code class="sourceCode default">std::hive</code> and the C++ standard
library<a href="#stdhive-and-the-c-standard-library" class="self-link"></a></h1>
<p><span class="citation" data-cites="P0447R22">[<a href="#ref-P0447R22" role="doc-biblioref">P0447R22</a>]</span>’s
<code class="sourceCode default">std::hive</code> is a high-performance
container, so all of the above points apply. It is undeniably a useful
container, and the provided reference implementation seems solid. We
have use-cases for it in our own projects.</p>
<p>However, <strong>we are not going to standardize the reference
implementation, we are going to standardize an interface.</strong></p>
<p>The interface leaves enough room to the standard library implementers
to make their own trade-offs, while at the same time being specific
enough that later optimizations might be breaking changes. We cannot
imagine a scenario where we care enough about performance to use
something like
<code class="sourceCode default">std::hive&lt;T&gt;</code> over a <code class="sourceCode default">std::vector&lt;std::unique_ptr&lt;T&gt;&gt;</code>
(maybe paired with a hash map to have efficient access from
<code class="sourceCode default">T*</code> to index), but do not care
enough about performance that we are just fine with whatever the quality
of the standard library implementation is—as opposed to the guarantee
from a specific external library.</p>
<p>Even if we ignore the downsides of standardizing a high-performance
container, what are the upsides?</p>
<p>It does not rely on compiler magic or OS APIs, so it does not need to
be in the standard library. Is it a vocabulary type? It used to have a
“priority” policy parameter and still has an allocator. Types with user
customizable policies are not usually vocabulary types since different
libraries might pick different policies, making them incompatible. Is it
fundamental to many programming tasks—that is, is it so frequently
needed that end users frequently need to invent it? While the author
argues that it is frequently needed in his domain, the reference
implementation uses novel algorithms. It is not a
<code class="sourceCode default">std::vector</code> or
<code class="sourceCode default">std::find</code> that would be
implemented the same everywhere if not in the standard. It also seems
like it is an area of active implementation improvements, which is not
possible with standardized containers.</p>
<p>That leaves convenience. Adding it to the standard library makes it
easier to use by others since it does not require setting up a build
system, package manager, or some other mechanism to get third-party
libraries. But is it going to be used by projects that do not already
have third-party dependencies? If not, the cost of adding yet another
third-party library is negligible.</p>
<p>So if we do not have any guarantee that the final implementation is
performant enough, and there is not a clear upside to standardizing it,
why should we take time out of the C++26 cycle on wording review of
<code class="sourceCode default">std::hive</code> in favor of SIMD,
Unicode, or executors?</p>
<h1 data-number="7" id="bibliography"><span class="header-section-number">7</span> References<a href="#bibliography" class="self-link"></a></h1>
<div id="refs" class="references csl-bib-body hanging-indent" role="list">
<div id="ref-P0447R22" class="csl-entry" role="listitem">
[P0447R22] Matt Bentley. 2023-05-17. Introduction of std::hive to the
standard library. <a href="https://wg21.link/p0447r22"><div class="csl-block">https://wg21.link/p0447r22</div></a>
</div>
<div id="ref-stdlib-bryce" class="csl-entry" role="listitem">
[stdlib-bryce] Bryce Adelstein Lelbach. What Belongs In The C++ Standard
Library? <a href="https://www.youtube.com/watch?v=OgM0MYb4DqE"><div class="csl-block">https://www.youtube.com/watch?v=OgM0MYb4DqE</div></a>
</div>
<div id="ref-stdlib-corentin" class="csl-entry" role="listitem">
[stdlib-corentin] Corentin Jabot. A cake for your cherry: what should go
in the C++ standard library? <a href="https://hackernoon.com/a-cake-for-your-cherry-what-should-go-in-the-c-standard-library-804fcecccef8"><div class="csl-block">https://hackernoon.com/a-cake-for-your-cherry-what-should-go-in-the-c-standard-library-804fcecccef8</div></a>
</div>
<div id="ref-stdlib-jonathan" class="csl-entry" role="listitem">
[stdlib-jonathan] Jonathan Müller. What should be part of the C++
standard library? <a href="https://www.foonathan.net/2017/11/standard-library/"><div class="csl-block">https://www.foonathan.net/2017/11/standard-library/</div></a>
</div>
<div id="ref-stdlib-titus" class="csl-entry" role="listitem">
[stdlib-titus] Titus Winters. What Should Go Into the C++ Standard
Library. <a href="https://abseil.io/blog/20180227-what-should-go-stdlib"><div class="csl-block">https://abseil.io/blog/20180227-what-should-go-stdlib</div></a>
</div>
</div>
</div>
</div>
</body>
</html>
