273 lines
21 KiB
HTML
273 lines
21 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++ 具名要求:容器 (Container)</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_Container 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">(Container)</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">(Container)</span></strong> 是用于存储其他对象并照顾管理其所容纳的对象所用的内存的对象。</p>
|
|
<h3><span class="mw-headline" id=".E8.A6.81.E6.B1.82">要求</span></h3>
|
|
<ul>
|
|
<li>容器类型 <code><b>C</b></code>;</li>
|
|
<li>元素类型 <code><b>T</b></code>;</li>
|
|
<li><code><b>C</b></code> 类型的对象 <code><b>a</b></code>、<code><b>b</b></code>。</li>
|
|
<li><code><b>rv</b></code> , <code><b>C</b></code> 类型右值表达式。</li>
|
|
</ul>
|
|
<h4><span class="mw-headline" id=".E7.B1.BB.E5.9E.8B">类型</span></h4>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>名称</th>
|
|
<th>类型</th>
|
|
<th>注解</th>
|
|
</tr>
|
|
<tr>
|
|
<td><code>value_type</code></td>
|
|
<td>T</td>
|
|
<td><a href="cpp-named_req-Erasable.html"><span style="font-style:italic">可擦除</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Erasable)</span></a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>reference</code></td>
|
|
<td>T&</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>const_reference</code></td>
|
|
<td>const T&</td>
|
|
<td></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>iterator</code></td>
|
|
<td>指向 T 的迭代器</td>
|
|
<td><a href="cpp-named_req-ForwardIterator.html"><span style="font-style:italic">老式向前迭代器</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(LegacyForwardIterator)</span></a><br />
|
|
可转换为 <code><b>const_iterator</b></code></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>const_iterator</code></td>
|
|
<td>指向 T 的常迭代器</td>
|
|
<td><a href="cpp-named_req-ForwardIterator.html"><span style="font-style:italic">老式向前迭代器</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(LegacyForwardIterator)</span></a></td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>difference_type</code></td>
|
|
<td>有符号整数</td>
|
|
<td>必须与 <code><b>iterator</b></code> 和 <code><b>const_iterator</b></code> 的 <code><b><a href="cpp-iterator-iterator_traits.html">iterator_traits</a>::difference_type</b></code> 相同</td>
|
|
</tr>
|
|
<tr>
|
|
<td><code>size_type</code></td>
|
|
<td>无符号整数</td>
|
|
<td>足够大以表示 <code><b>difference_type</b></code> 的所有正值</td>
|
|
</tr>
|
|
</table>
|
|
<h4><span class="mw-headline" id=".E6.96.B9.E6.B3.95.E4.B8.8E.E8.BF.90.E7.AE.97.E7.AC.A6">方法与运算符</span></h4>
|
|
<table class="wikitable">
|
|
<tr>
|
|
<th>表达式</th>
|
|
<th>返回类型</th>
|
|
<th>语义</th>
|
|
<th>条件</th>
|
|
<th>复杂度</th>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">C<span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>C</td>
|
|
<td>创建空容器</td>
|
|
<td>后:C().empty() == true</td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">C<span class="br0">(</span>a<span class="br0">)</span></span></span></td>
|
|
<td>C</td>
|
|
<td>创建 <code><b>a</b></code> 的副本</td>
|
|
<td>前:T 必须为<a href="cpp-named_req-CopyInsertable.html"><span style="font-style:italic">可复制插入</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyInsertable)</span></a><br />
|
|
后:a == C(a)</td>
|
|
<td>线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">C<span class="br0">(</span>rv<span class="br0">)</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
<td>C</td>
|
|
<td>移动 <code><b>rv</b></code></td>
|
|
<td>后:等于 rv 在此构造前的值</td>
|
|
<td>常数<sup id="cite_ref-array_1-0" class="reference"><a href="cpp-named_req-Container.html#cite_note-array-1">[1]</a></sup></td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> b</span></span></td>
|
|
<td>C&</td>
|
|
<td>销毁或从 <code><b>b</b></code> 的元素复制赋值 <code><b>a</b></code> 的所有元素</td>
|
|
<td>后:a == b</td>
|
|
<td>线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">=</span> rv</span></span></td>
|
|
<td>C&</td>
|
|
<td>销毁或从 <code><b>rv</b></code> 的元素移动赋值 <code><b>a</b></code> 的所有元素</td>
|
|
<td>后:若 a 与 rv 不指代同一对象则 a 等于 rv 在此赋值前拥有的值</td>
|
|
<td>线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.~C<span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>void</td>
|
|
<td>销毁 <code><b>a</b></code> 的所有元素并释放所有内存</td>
|
|
<td></td>
|
|
<td>线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>(const_)iterator</td>
|
|
<td>指向 <code><b>a</b></code> 首元素的迭代器</td>
|
|
<td></td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>(const_)iterator</td>
|
|
<td>指向 <code><b>a</b></code> 尾元素后一位的元素</td>
|
|
<td></td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">cbegin</span><span class="br0">(</span><span class="br0">)</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
<td>const_iterator</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">const_cast</span><span class="sy1"><</span><span class="kw4">const</span> C<span class="sy3">&</span><span class="sy1">></span><span class="br0">(</span>a<span class="br0">)</span>.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">cend</span><span class="br0">(</span><span class="br0">)</span></span></span><span class="t-mark-rev t-since-cxx11">(C++11 起)</span></td>
|
|
<td>const_iterator</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="kw1">const_cast</span><span class="sy1"><</span><span class="kw4">const</span> C<span class="sy3">&</span><span class="sy1">></span><span class="br0">(</span>a<span class="br0">)</span>.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy1">==</span> b</span></span></td>
|
|
<td>可转换为 bool</td>
|
|
<td><span class="t-rev-inl t-rev-inl-noborder t-until-cxx14"><span><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">==</span> b.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span> <span class="sy3">&&</span><br />
|
|
<a href="cpp-algorithm-equal.html"><span class="kw1573">std::<span class="me2">equal</span></span></a><span class="br0">(</span>a.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, a.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span>, b.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span></span><br /></span> <span><span class="t-mark-rev t-until-cxx14">(C++14 前)</span></span></span><span class="t-rev-inl t-rev-inl-noborder t-since-cxx14"><span><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-algorithm-equal.html"><span class="kw1573">std::<span class="me2">equal</span></span></a><span class="br0">(</span>a.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, a.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span>, b.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, b.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span></span><br /></span> <span><span class="t-mark-rev t-since-cxx14">(C++14 起)</span></span></span></td>
|
|
<td>前:T 必须<a href="cpp-named_req-EqualityComparable.html"><span style="font-style:italic">可相等比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(EqualityComparable)</span></a></td>
|
|
<td>若 <code>a.size() != b.size()</code> 则为常数<sup id="cite_ref-2" class="reference"><a href="cpp-named_req-Container.html#cite_note-2">[2]</a></sup>,否则为线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a <span class="sy3">!</span><span class="sy1">=</span> b</span></span></td>
|
|
<td>可转换为 bool</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><span class="sy3">!</span><span class="br0">(</span>a <span class="sy1">==</span> b<span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>线性</td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">swap</span><span class="br0">(</span>b<span class="br0">)</span></span></span></td>
|
|
<td>void</td>
|
|
<td>交换 <code><b>a</b></code> 与 <code><b>b</b></code> 的值</td>
|
|
<td></td>
|
|
<td>常数<sup id="cite_ref-array_1-1" class="reference"><a href="cpp-named_req-Container.html#cite_note-array-1">[1]</a></sup><sup id="cite_ref-should_3-0" class="reference"><a href="cpp-named_req-Container.html#cite_note-should-3">[3]</a></sup></td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">swap<span class="br0">(</span>a, b<span class="br0">)</span></span></span></td>
|
|
<td>void</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">swap</span><span class="br0">(</span>b<span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>常数<sup id="cite_ref-array_1-2" class="reference"><a href="cpp-named_req-Container.html#cite_note-array-1">[1]</a></sup></td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>size_type</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp"><a href="cpp-iterator-distance.html"><span class="kw673">std::<span class="me2">distance</span></span></a><span class="br0">(</span>a.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span>, a.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span><span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>常数<sup id="cite_ref-should_3-1" class="reference"><a href="cpp-named_req-Container.html#cite_note-should-3">[3]</a></sup></td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">max_size</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>size_type</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">b.<span class="me1">size</span><span class="br0">(</span><span class="br0">)</span></span></span> ,其中 <code><b>b</b></code> 是最大的可能容器</td>
|
|
<td></td>
|
|
<td>常数<sup id="cite_ref-should_3-2" class="reference"><a href="cpp-named_req-Container.html#cite_note-should-3">[3]</a></sup></td>
|
|
</tr>
|
|
<tr>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">empty</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td>可转换为 bool</td>
|
|
<td><span class="t-c"><span class="mw-geshi cpp source-cpp">a.<span class="me1">begin</span><span class="br0">(</span><span class="br0">)</span> <span class="sy1">==</span> a.<span class="me1">end</span><span class="br0">(</span><span class="br0">)</span></span></span></td>
|
|
<td></td>
|
|
<td>常数</td>
|
|
</tr>
|
|
<tr>
|
|
<th colspan="6">注</th>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="6">
|
|
<ol class="references">
|
|
<li id="cite_note-array-1"><span class="mw-cite-backlink">↑ <sup><a href="cpp-named_req-Container.html#cite_ref-array_1-0">1.0</a></sup> <sup><a href="cpp-named_req-Container.html#cite_ref-array_1-1">1.1</a></sup> <sup><a href="cpp-named_req-Container.html#cite_ref-array_1-2">1.2</a></sup></span> <span class="reference-text">对 <span class="t-lc"><a href="cpp-container-array.html">std::array</a></span> 为线性</span></li>
|
|
<li id="cite_note-2"><span class="mw-cite-backlink"><a href="cpp-named_req-Container.html#cite_ref-2">↑</a></span> <span class="reference-text">对于 <span class="t-lc"><a href="cpp-container-forward_list.html">std::forward_list</a></span> 始终为线性</span></li>
|
|
<li id="cite_note-should-3"><span class="mw-cite-backlink">↑ <sup><a href="cpp-named_req-Container.html#cite_ref-should_3-0">3.0</a></sup> <sup><a href="cpp-named_req-Container.html#cite_ref-should_3-1">3.1</a></sup> <sup><a href="cpp-named_req-Container.html#cite_ref-should_3-2">3.2</a></sup></span> <span class="reference-text"><span class="t-mark-rev t-until-cxx11">(C++11 前)</span> 非严格常数</span></li>
|
|
</ol>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p>给定</p>
|
|
<ul>
|
|
<li>容器的 <code>iterator</code> 类型的对象 <code>i</code> 与 <code>j</code>,</li>
|
|
</ul>
|
|
<p>表达式 <span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy1">==</span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy3">!</span><span class="sy1">=</span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy1"><</span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy1"><=</span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy1">>=</span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy1">></span> j</span></span>、<span class="t-c"><span class="mw-geshi cpp source-cpp">i <span class="sy2">-</span> j</span></span> 中,任一或二者都可以用指代相同元素的一个该容器的 <code>const_iterator</code> 类型的对象替换,而不更改其语义。</p>
|
|
<h3><span class="mw-headline" id=".E5.AE.B9.E5.99.A8.E6.95.B0.E6.8D.AE.E7.AB.9E.E4.BA.89">容器数据竞争</span></h3>
|
|
<p>见<a href="cpp-container.html#.E7.BA.BF.E7.A8.8B.E5.AE.89.E5.85.A8">容器线程安全</a></p>
|
|
<h3><span class="mw-headline" id=".E5.85.B6.E4.BB.96.E8.A6.81.E6.B1.82">其他要求</span></h3>
|
|
<dl>
|
|
<dt>C</dt>
|
|
</dl>
|
|
<ul>
|
|
<li><a href="cpp-named_req-DefaultConstructible.html"><span style="font-style:italic">可默认构造</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(DefaultConstructible)</span></a></li>
|
|
<li><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></li>
|
|
<li><a href="cpp-named_req-EqualityComparable.html"><span style="font-style:italic">可相等比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(EqualityComparable)</span></a></li>
|
|
<li><a href="cpp-named_req-Swappable.html"><span style="font-style:italic">可交换</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(Swappable)</span></a></li>
|
|
</ul>
|
|
<dl>
|
|
<dt>T</dt>
|
|
</dl>
|
|
<ul>
|
|
<li><a href="cpp-named_req-CopyInsertable.html"><span style="font-style:italic">可复制插入</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(CopyInsertable)</span></a></li>
|
|
<li><a href="cpp-named_req-EqualityComparable.html"><span style="font-style:italic">可相等比较</span> <span style="font-family: Georgia, 'DejaVu Serif', serif; font-style:italic">(EqualityComparable)</span></a></li>
|
|
<li><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>
|
|
<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/issue179">LWG 179</a></td>
|
|
<td>C++98</td>
|
|
<td><code>iterator</code> 与 <code>const_iterator</code> 类型可能不可比较</td>
|
|
<td>要求可比较</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2263">LWG 2263</a></td>
|
|
<td>C++11</td>
|
|
<td>LWG179 的解决方案在 C++11 中被意外丢弃</td>
|
|
<td>已恢复</td>
|
|
</tr>
|
|
<tr>
|
|
<td><a rel="nofollow" class="external text" href="https://cplusplus.github.io/LWG/issue2839">LWG 2839</a></td>
|
|
<td>C++11</td>
|
|
<td>不允许标准容器的自移动赋值</td>
|
|
<td>容许但结果未指定</td>
|
|
</tr>
|
|
</table>
|
|
<h3><span class="mw-headline" id=".E5.8F.82.E9.98.85">参阅</span></h3>
|
|
<table class="t-dsc-begin"></table>
|
|
</div>
|
|
<div class="visualClear"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</body>
|
|
</html>
|