<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>Vector - 标签 - 豆浆小屋</title><link>https://soybeanmilk.netlify.app/tags/vector/</link><description>Vector - 标签 - 豆浆小屋</description><generator>Hugo -- gohugo.io</generator><language>zh-CN</language><copyright>This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.</copyright><lastBuildDate>Fri, 17 Jul 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://soybeanmilk.netlify.app/tags/vector/" rel="self" type="application/rss+xml"/><item><title>C++ vector 深度解析</title><link>https://soybeanmilk.netlify.app/cpp-vector%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp-vector%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90/</guid><description><![CDATA[<h2 id="一底层原理" class="headerLink">
    <a href="#%e4%b8%80%e5%ba%95%e5%b1%82%e5%8e%9f%e7%90%86" class="header-mark"></a>1 一、底层原理</h2><p>vector 是<strong>动态数组</strong>，底层是一段连续的内存空间。</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">┌───┬───┬───┬───┬───┬───┬───┬───┐
</span></span><span class="line"><span class="cl">│ 0 │ 1 │ 2 │ 3 │   │   │   │   │
</span></span><span class="line"><span class="cl">└───┴───┴───┴───┴───┴───┴───┴───┘
</span></span><span class="line"><span class="cl">  size = 4          capacity = 8
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>size</strong>：当前元素个数</li>
<li><strong>capacity</strong>：实际分配的内存容量</li>
<li>当 <code>size == capacity</code> 时再插入，会触发扩容</li>
</ul>
<hr>
<h2 id="二扩容机制" class="headerLink">
    <a href="#%e4%ba%8c%e6%89%a9%e5%ae%b9%e6%9c%ba%e5%88%b6" class="header-mark"></a>2 二、扩容机制</h2><h3 id="扩容过程" class="headerLink">
    <a href="#%e6%89%a9%e5%ae%b9%e8%bf%87%e7%a8%8b" class="header-mark"></a>2.1 扩容过程</h3><ol>
<li>重新分配一块更大的内存（通常 1.5 倍或 2 倍）</li>
<li>把旧元素全部拷贝/移动到新内存</li>
<li>释放旧内存</li>
<li>更新内部指针</li>
</ol>
<p><strong>GCC 是 2 倍扩容，VS 是 1.5 倍扩容。</strong></p>
<h3 id="时间复杂度" class="headerLink">
    <a href="#%e6%97%b6%e9%97%b4%e5%a4%8d%e6%9d%82%e5%ba%a6" class="header-mark"></a>2.2 时间复杂度</h3><ul>
<li>均摊 O(1)：大部分插入是 O(1)，偶尔扩容 O(n)，平均下来还是 O(1)</li>
</ul>
<h3 id="避免扩容的方法" class="headerLink">
    <a href="#%e9%81%bf%e5%85%8d%e6%89%a9%e5%ae%b9%e7%9a%84%e6%96%b9%e6%b3%95" class="header-mark"></a>2.3 避免扩容的方法</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>  <span class="c1">// 提前分配 1000 容量，避免中途扩容
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="三迭代器失效" class="headerLink">
    <a href="#%e4%b8%89%e8%bf%ad%e4%bb%a3%e5%99%a8%e5%a4%b1%e6%95%88" class="header-mark"></a>3 三、迭代器失效</h2><h3 id="什么情况会失效" class="headerLink">
    <a href="#%e4%bb%80%e4%b9%88%e6%83%85%e5%86%b5%e4%bc%9a%e5%a4%b1%e6%95%88" class="header-mark"></a>3.1 什么情况会失效？</h3><p><strong>1. 插入操作（push_back, insert）</strong></p>
<ul>
<li>触发扩容 → 所有迭代器、引用、指针全部失效</li>
<li>没扩容 → 插入位置之后的迭代器失效</li>
</ul>
<p><strong>2. 删除操作（erase, pop_back）</strong></p>
<ul>
<li>删除位置及之后的迭代器失效</li>
<li>end() 永远失效</li>
</ul>
<p><strong>3. swap / clear</strong></p>
<ul>
<li>swap：两个 vector 的迭代器互换</li>
<li>clear：所有迭代器失效，但 capacity 不变</li>
</ul>
<h3 id="经典坑erase-遍历" class="headerLink">
    <a href="#%e7%bb%8f%e5%85%b8%e5%9d%91erase-%e9%81%8d%e5%8e%86" class="header-mark"></a>3.2 经典坑：erase 遍历</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt"> 1
</span><span class="lnt"> 2
</span><span class="lnt"> 3
</span><span class="lnt"> 4
</span><span class="lnt"> 5
</span><span class="lnt"> 6
</span><span class="lnt"> 7
</span><span class="lnt"> 8
</span><span class="lnt"> 9
</span><span class="lnt">10
</span><span class="lnt">11
</span><span class="lnt">12
</span><span class="lnt">13
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// ❌ 错误写法：it 失效后 ++ 是未定义行为
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="o">++</span><span class="n">it</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span> <span class="n">v</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">it</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// ✅ 正确写法：erase 返回下一个有效迭代器
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">();</span> <span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="n">it</span> <span class="o">==</span> <span class="n">target</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="n">it</span> <span class="o">=</span> <span class="n">v</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">it</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="o">++</span><span class="n">it</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="四常用操作" class="headerLink">
    <a href="#%e5%9b%9b%e5%b8%b8%e7%94%a8%e6%93%8d%e4%bd%9c" class="header-mark"></a>4 四、常用操作</h2><h3 id="构造函数" class="headerLink">
    <a href="#%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0" class="header-mark"></a>4.1 构造函数</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v1</span><span class="p">;</span>                <span class="c1">// 空
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v2</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>            <span class="c1">// 10 个元素，默认 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v3</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>         <span class="c1">// 10 个 5
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v4</span><span class="p">{</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">};</span>    <span class="c1">// 列表初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v5</span><span class="p">(</span><span class="n">v4</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v4</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>  <span class="c1">// 迭代器范围
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="卡点构造时填了初值push_back-从哪开始" class="headerLink">
    <a href="#%e5%8d%a1%e7%82%b9%e6%9e%84%e9%80%a0%e6%97%b6%e5%a1%ab%e4%ba%86%e5%88%9d%e5%80%bcpush_back-%e4%bb%8e%e5%93%aa%e5%bc%80%e5%a7%8b" class="header-mark"></a>4.2 卡点：构造时填了初值，push_back 从哪开始</h3><blockquote>
<p>我的疑问：<code>vector&lt;int&gt; v(5, 0)</code> 之后再 <code>push_back</code>，新元素是不是插不进&quot;前面&quot;？</p>
<p>是的——<strong><code>v(n, 0)</code> 是&quot;先定长填 n 个 0&quot;，size 已经是 n；之后 push_back 永远追加在末尾</strong>（下标 n 开始），不会从头插：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">(</span><span class="mi">5</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>   <span class="c1">// {0,0,0,0,0}，size = 5
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>        <span class="c1">// {0,0,0,0,0,7}，7 在下标 5（第 6 位）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">w</span><span class="p">;</span>         <span class="c1">// 空，size = 0
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">w</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">7</span><span class="p">);</span>        <span class="c1">// {7}，7 在下标 0（第 1 位）
</span></span></span></code></pre></td></tr></table>
</div>
</div></blockquote>
<p><strong>两种思路二选一，别混：</strong></p>
<table>
  <thead>
      <tr>
          <th>目的</th>
          <th>正确写法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>动态追加（数量不定）</td>
          <td>初始化为<strong>空</strong> <code>vector&lt;int&gt; v;</code>，只 push_back</td>
      </tr>
      <tr>
          <td>固定长度按下标填</td>
          <td><code>vector&lt;int&gt; v(n, 0);</code> 然后 <code>v[i] = x;</code>（下标改，不是 push_back）</td>
      </tr>
  </tbody>
</table>
<p><strong>常见坑</strong>：先 <code>v(n, 0)</code> 又 push_back → 得到 n+1 个元素、前 n 个全是 0，数据全挤到后面；<code>v[i] = x</code> 越界是未定义行为（不会自动扩容，可能直接崩）。</p>
<h3 id="增删改查" class="headerLink">
    <a href="#%e5%a2%9e%e5%88%a0%e6%94%b9%e6%9f%a5" class="header-mark"></a>4.3 增删改查</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>     <span class="c1">// 尾部插入 O(1) 均摊
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">pop_back</span><span class="p">();</span>        <span class="c1">// 尾部删除 O(1)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">it</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span>    <span class="c1">// 指定位置插入 O(n)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">it</span><span class="p">);</span>         <span class="c1">// 删除指定位置 O(n)
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>           <span class="c1">// 清空所有元素，capacity 不变
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">shrink_to_fit</span><span class="p">();</span>   <span class="c1">// 释放多余空间，capacity = size
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="访问" class="headerLink">
    <a href="#%e8%ae%bf%e9%97%ae" class="header-mark"></a>4.4 访问</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">v</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>          <span class="c1">// 下标访问，不检查越界
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">at</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>       <span class="c1">// 带越界检查，越界抛 out_of_range
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">front</span><span class="p">();</span>     <span class="c1">// 第一个元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">back</span><span class="p">();</span>      <span class="c1">// 最后一个元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">data</span><span class="p">();</span>      <span class="c1">// 底层数组指针
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="大小相关" class="headerLink">
    <a href="#%e5%a4%a7%e5%b0%8f%e7%9b%b8%e5%85%b3" class="header-mark"></a>4.5 大小相关</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>       <span class="c1">// 元素个数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">capacity</span><span class="p">();</span>   <span class="c1">// 容量
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">empty</span><span class="p">();</span>      <span class="c1">// 是否为空
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>   <span class="c1">// 预留容量
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">resize</span><span class="p">(</span><span class="n">n</span><span class="p">);</span>    <span class="c1">// 改变 size，多删少补
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="五内存管理细节" class="headerLink">
    <a href="#%e4%ba%94%e5%86%85%e5%ad%98%e7%ae%a1%e7%90%86%e7%bb%86%e8%8a%82" class="header-mark"></a>5 五、内存管理细节</h2><h3 id="clear-不释放内存" class="headerLink">
    <a href="#clear-%e4%b8%8d%e9%87%8a%e6%94%be%e5%86%85%e5%ad%98" class="header-mark"></a>5.1 clear() 不释放内存</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">(</span><span class="mi">1000</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>          <span class="c1">// size = 0，但 capacity 还是 1000
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="真正释放内存的方法" class="headerLink">
    <a href="#%e7%9c%9f%e6%ad%a3%e9%87%8a%e6%94%be%e5%86%85%e5%ad%98%e7%9a%84%e6%96%b9%e6%b3%95" class="header-mark"></a>5.2 真正释放内存的方法</h3><div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="c1">// 方法1：swap 空 vector
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">().</span><span class="n">swap</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 方法2：shrink_to_fit（C++11）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">v</span><span class="p">.</span><span class="n">clear</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">shrink_to_fit</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="用-reserve-优化性能" class="headerLink">
    <a href="#%e7%94%a8-reserve-%e4%bc%98%e5%8c%96%e6%80%a7%e8%83%bd" class="header-mark"></a>5.3 用 reserve 优化性能</h3><p>知道大概要存多少元素时，提前 reserve：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">v</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span><span class="p">.</span><span class="n">reserve</span><span class="p">(</span><span class="mi">10000</span><span class="p">);</span>  <span class="c1">// 一次分配到位
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">10000</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">v</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">i</span><span class="p">);</span>  <span class="c1">// 不会触发扩容
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六常见坑点总结" class="headerLink">
    <a href="#%e5%85%ad%e5%b8%b8%e8%a7%81%e5%9d%91%e7%82%b9%e6%80%bb%e7%bb%93" class="header-mark"></a>6 六、常见坑点总结</h2><table>
  <thead>
      <tr>
          <th>坑点</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>迭代器失效</td>
          <td>插入删除后旧迭代器不能再用</td>
      </tr>
      <tr>
          <td>引用失效</td>
          <td>扩容后所有引用都悬空</td>
      </tr>
      <tr>
          <td><code>[]</code> 越界</td>
          <td>不检查，越界是 UB，用 <code>at()</code> 更安全</td>
      </tr>
      <tr>
          <td>resize vs reserve</td>
          <td>resize 改 size，reserve 只改 capacity</td>
      </tr>
      <tr>
          <td>空 vector 调用 front/back</td>
          <td>UB，先判断 empty</td>
      </tr>
      <tr>
          <td>vector&lt;bool&gt;</td>
          <td>不是真正的 vector，是位压缩的特殊实现，尽量别用</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="七性能对比" class="headerLink">
    <a href="#%e4%b8%83%e6%80%a7%e8%83%bd%e5%af%b9%e6%af%94" class="header-mark"></a>7 七、性能对比</h2><table>
  <thead>
      <tr>
          <th>操作</th>
          <th>时间复杂度</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>随机访问</td>
          <td>O(1)</td>
      </tr>
      <tr>
          <td>尾插 push_back</td>
          <td>O(1) 均摊</td>
      </tr>
      <tr>
          <td>尾删 pop_back</td>
          <td>O(1)</td>
      </tr>
      <tr>
          <td>中间插入</td>
          <td>O(n)</td>
      </tr>
      <tr>
          <td>中间删除</td>
          <td>O(n)</td>
      </tr>
      <tr>
          <td>扩容</td>
          <td>O(n)</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p>💡 能用 vector 就用 vector，连续内存缓存友好，是最快的序列容器。</p></blockquote>
]]></description></item></channel></rss>