84 lines
6.8 KiB
HTML
84 lines
6.8 KiB
HTML
<!DOCTYPE html>
|
|
<html lang="zh" dir="ltr" class="client-nojs" xmlns="http://www.w3.org/1999/xhtml" xml:lang="zh">
|
|
<head><meta http-equiv="x-ua-compatible" content="ie=edge">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
|
|
<title>C++ 具名要求:散列 (Hash)</title>
|
|
<link rel="stylesheet" href="ext.css" />
|
|
<link rel="stylesheet" href="site_modules.css" />
|
|
</head>
|
|
<body class="mediawiki ltr sitedir-ltr ns-0 ns-subject page-cpp_named_req_Hash skin-cppreference2 action-view cpp-navbar">
|
|
<div id="cpp-content-base">
|
|
<div id="content"><a id="top"></a>
|
|
<h1 id="firstHeading" class="firstHeading"><span style="font-size:0.7em; line-height:130%">C++ 具名要求:</span><span style="font-style:italic">散列</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Hash)</span></h1>
|
|
<div id="bodyContent">
|
|
<div id="contentSub"><span class="subpages">< <a href="cpp.html">cpp</a>‎ | <a href="cpp-named_req.html">named req</a></span></div>
|
|
<div id="mw-content-text" lang="zh" dir="ltr" class="mw-content-ltr" xml:lang="zh">
|
|
<p><strong class="selflink"><span style="font-style:italic">散列</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Hash)</span></strong> 是函数对象,其输出仅依赖于输入,且当给定不同输入值时,有非常低的概率生成相同输出。</p>
|
|
<h3><span class="mw-headline" id=".E8.A6.81.E6.B1.82">要求</span></h3>
|
|
<p>以下情况下,类型 <code>T</code> 满足<span style="font-style:italic">散列</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Hash)</span> :</p>
|
|
<ul>
|
|
<li>类型 <code>T</code> 满足<a href="cpp-named_req-FunctionObject.html"><span style="font-style:italic">函数对象</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(FunctionObject)</span></a> 、<a href="cpp-named_req-CopyConstructible.html"><span style="font-style:italic">可复制构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyConstructible)</span></a> 、<a href="cpp-named_req-Destructible.html"><span style="font-style:italic">可析构</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Destructible)</span></a> ,且</li>
|
|
</ul>
|
|
<p>给定</p>
|
|
<ul>
|
|
<li><code>T</code> 或 <code>const T</code> 类型的值 <code>h</code>,其实参类型是 <code>Key</code></li>
|
|
<li>可转换为 <code>Key</code> 或 <code>const Key</code> 的值 <code>k</code></li>
|
|
<li><code>Key</code> 类型的<a href="cpp-language-value_category.html">左值</a>表达式 <code>u</code></li>
|
|
</ul>
|
|
<p>下列表达是必须合法且拥有其指定的效果</p>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>表达式</th>
|
|
<th>返回类型</th>
|
|
<th>要求</th>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">h<span class="br0">(</span>k<span class="br0">)</span></span></span></td>
|
|
<td><code>std::size_t</code></td>
|
|
<td>返回值在程序执行期间仅依赖于 <code>k</code> 的值。所有在程序执行内执行的 <span class="t-c"><span class="mw-geshi cpp source-cpp">h<span class="br0">(</span>k<span class="br0">)</span></span></span> 的求值对 <code>k</code> 的相同值生成相同结果。
|
|
<p><span class="t-c"><span class="mw-geshi cpp source-cpp">a<span class="sy3">!</span><span class="sy1">=</span>b</span></span> 的情况下 <span class="t-c"><span class="mw-geshi cpp source-cpp">h<span class="br0">(</span>a<span class="br0">)</span><span class="sy1">==</span>h<span class="br0">(</span>b<span class="br0">)</span></span></span> 的概率应当趋近于 <span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="nu16">1.0</span><span class="sy2">/</span><a href="cpp-types-numeric_limits.html"><span class="kw344">std::<span class="me2">numeric_limits</span></span></a><span class="sy1"><</span><a href="cpp-types-size_t.html"><span class="kw100">std::<span class="me2">size_t</span></span></a><span class="sy1">></span><span class="sy4">::</span><span class="me2">max</span><span class="br0">(</span><span class="br0">)</span></span></span>。</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">h<span class="br0">(</span>u<span class="br0">)</span></span></span></td>
|
|
<td><code>std::size_t</code></td>
|
|
<td>不修改 <code>u</code></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E6.A0.87.E5.87.86.E5.BA.93">标准库</span></h3>
|
|
<table class="t-dsc-begin">
|
|
<tr class="t-dsc">
|
|
<td>
|
|
<div class="t-dsc-member-div">
|
|
<div><a href="cpp-utility-hash.html"><span class="t-lines"><span>hash</span></span></a></div>
|
|
<div><span class="t-lines"><span><span class="t-mark-rev t-since-cxx11">(C++11)</span></span></span></div>
|
|
</div>
|
|
</td>
|
|
<td>散列函数对象<br />
|
|
<span class="t-mark">(类模板)</span></td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E7.BC.BA.E9.99.B7.E6.8A.A5.E5.91.8A">缺陷报告</span></h3>
|
|
<p>下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。</p>
|
|
<table class="dsctable" style="font-size:0.8em">
|
|
<tr>
|
|
<th>DR</th>
|
|
<th>应用于</th>
|
|
<th>出版时的行为</th>
|
|
<th>正确行为</th>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2291">LWG 2291</a></td>
|
|
<td>C++11</td>
|
|
<td>在所有情况下要求对相同参数的相同结果</td>
|
|
<td>仅在单次执行内要求</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|