<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>C++ - 分类 - 豆浆小屋</title><link>https://soybeanmilk.netlify.app/categories/c++/</link><description>C++ - 分类 - 豆浆小屋</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, 09 Oct 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://soybeanmilk.netlify.app/categories/c++/" rel="self" type="application/rss+xml"/><item><title>C++ 学习与面试资料导航</title><link>https://soybeanmilk.netlify.app/cpp%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E5%AF%BC%E8%88%AA/</link><pubDate>Fri, 09 Oct 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%96%99%E5%AF%BC%E8%88%AA/</guid><description><![CDATA[<p>这份导航收集了一批公开可访问的 C++ 学习资料。它们各有侧重：有的适合建立知识地图，有的适合按题复习，有的则能直接跟着源码理解工程实现。</p>
<p>如果刚开始整理知识体系，建议先选一个综合站点作为主线，再用题库查漏补缺。项目源码更适合在掌握基础语法、CMake 和调试工具后动手。</p>
<h2 id="一系统知识库用来建立主线" class="headerLink">
    <a href="#%e4%b8%80%e7%b3%bb%e7%bb%9f%e7%9f%a5%e8%af%86%e5%ba%93%e7%94%a8%e6%9d%a5%e5%bb%ba%e7%ab%8b%e4%b8%bb%e7%ba%bf" class="header-mark"></a>1 一、系统知识库：用来建立主线</h2><h3 id="编程指北c-面试题库httpscsguidecncppintrohtml" class="headerLink">
    <a href="#%e7%bc%96%e7%a8%8b%e6%8c%87%e5%8c%97c-%e9%9d%a2%e8%af%95%e9%a2%98%e5%ba%93httpscsguidecncppintrohtml" class="header-mark"></a>1.1 <a href="https://csguide.cn/cpp/intro.html" target="_blank" rel="noopener noreferrer">编程指北：C++ 面试题库</a></h3><p>覆盖 C++ 基础、面向对象、内存管理和现代 C++ 等模块。分类清楚，适合先快速浏览目录，建立“还需要学什么”的整体地图。</p>
<h3 id="huihutcc-技术面试知识库httpsinterviewhuihutcom" class="headerLink">
    <a href="#huihutcc-%e6%8a%80%e6%9c%af%e9%9d%a2%e8%af%95%e7%9f%a5%e8%af%86%e5%ba%93httpsinterviewhuihutcom" class="header-mark"></a>1.2 <a href="https://interview.huihut.com/" target="_blank" rel="noopener noreferrer">huihut：C/C++ 技术面试知识库</a></h3><p>除了 C/C++，还包含 STL、数据结构、操作系统、网络与链接装载等内容。适合把语言知识和计算机基础串起来。</p>
<ul>
<li><a href="https://github.com/huihut/interview" target="_blank" rel="noopener noreferrer">对应的 GitHub 开源仓库</a></li>
</ul>
<h3 id="卡码笔记面试知识库httpsnoteskamacodercom" class="headerLink">
    <a href="#%e5%8d%a1%e7%a0%81%e7%ac%94%e8%ae%b0%e9%9d%a2%e8%af%95%e7%9f%a5%e8%af%86%e5%ba%93httpsnoteskamacodercom" class="header-mark"></a>1.3 <a href="https://notes.kamacoder.com/" target="_blank" rel="noopener noreferrer">卡码笔记：面试知识库</a></h3><p>覆盖语言、操作系统、网络和并发等常见方向，适合按模块复习，并顺着题目继续追问底层机制。</p>
<h3 id="小林-codingc-面试题httpsxiaolincodingcominterviewcpphtml" class="headerLink">
    <a href="#%e5%b0%8f%e6%9e%97-codingc-%e9%9d%a2%e8%af%95%e9%a2%98httpsxiaolincodingcominterviewcpphtml" class="header-mark"></a>1.4 <a href="https://xiaolincoding.com/interview/cpp.html" target="_blank" rel="noopener noreferrer">小林 coding：C++ 面试题</a></h3><p>以问题为入口，配有较多图解。遇到内存管理、STL 或语言特性等问题时，可以用来辅助理解。</p>
<h2 id="二逐题练习用来查漏补缺" class="headerLink">
    <a href="#%e4%ba%8c%e9%80%90%e9%a2%98%e7%bb%83%e4%b9%a0%e7%94%a8%e6%9d%a5%e6%9f%a5%e6%bc%8f%e8%a1%a5%e7%bc%ba" class="header-mark"></a>2 二、逐题练习：用来查漏补缺</h2><h3 id="面试鸭c-基础面试题库httpswwwmianshiyacombank1810642495797854209" class="headerLink">
    <a href="#%e9%9d%a2%e8%af%95%e9%b8%adc-%e5%9f%ba%e7%a1%80%e9%9d%a2%e8%af%95%e9%a2%98%e5%ba%93httpswwwmianshiyacombank1810642495797854209" class="header-mark"></a>2.1 <a href="https://www.mianshiya.com/bank/1810642495797854209" target="_blank" rel="noopener noreferrer">面试鸭：C++ 基础面试题库</a></h3><p>适合快速检查基础题覆盖情况。使用时不要只背结论，可以继续追问：为什么这样设计、底层如何实现、边界在哪里。</p>
<h3 id="拾光小舟c-基础面试集httpsblogtttxiaozcnpostsinterviewc-e59fbae7a180" class="headerLink">
    <a href="#%e6%8b%be%e5%85%89%e5%b0%8f%e8%88%9fc-%e5%9f%ba%e7%a1%80%e9%9d%a2%e8%af%95%e9%9b%86httpsblogtttxiaozcnpostsinterviewc-e59fbae7a180" class="header-mark"></a>2.2 <a href="https://blog.tttxiaoz.cn/posts/interview/c-%E5%9F%BA%E7%A1%80/" target="_blank" rel="noopener noreferrer">拾光小舟：C++ 基础面试集</a></h3><p>按“回答重点”和扩展内容组织，适合把零散知识整理成能在面试中表达的答案。</p>
<h3 id="程序厨c-面试题库httpswwwchengxuchucom" class="headerLink">
    <a href="#%e7%a8%8b%e5%ba%8f%e5%8e%a8c-%e9%9d%a2%e8%af%95%e9%a2%98%e5%ba%93httpswwwchengxuchucom" class="header-mark"></a>2.3 <a href="https://www.chengxuchu.com/" target="_blank" rel="noopener noreferrer">程序厨：C++ 面试题库</a></h3><p>题目覆盖面较广，可以当作复习清单使用。遇到没有完整展开的题目，再回到系统知识库补原理。</p>
<h3 id="guaguaupupc-后台开发面经httpsgithubcomguaguaupupcpp_interview" class="headerLink">
    <a href="#guaguaupupc-%e5%90%8e%e5%8f%b0%e5%bc%80%e5%8f%91%e9%9d%a2%e7%bb%8fhttpsgithubcomguaguaupupcpp_interview" class="header-mark"></a>2.4 <a href="https://github.com/guaguaupup/cpp_interview" target="_blank" rel="noopener noreferrer">guaguaupup：C++ 后台开发面经</a></h3><p>内容覆盖 C++、Linux、操作系统、网络、数据库和设计模式等方向，适合准备后端岗位时补齐关联知识。</p>
<h2 id="三作者公开资料用来交叉验证" class="headerLink">
    <a href="#%e4%b8%89%e4%bd%9c%e8%80%85%e5%85%ac%e5%bc%80%e8%b5%84%e6%96%99%e7%94%a8%e6%9d%a5%e4%ba%a4%e5%8f%89%e9%aa%8c%e8%af%81" class="header-mark"></a>3 三、作者公开资料：用来交叉验证</h2><p>下面几处资料来自同一作者或同一资料体系，适合互相对照，不必重复通读。</p>
<ul>
<li><a href="https://aigccoding.feishu.cn/wiki/PQhfwgLOoi4cqgkyDTecelDDnNe" target="_blank" rel="noopener noreferrer">程序喵大人的公开知识库入口</a></li>
<li><a href="https://chengxumiaodaren.com/docs/interview/advance/" target="_blank" rel="noopener noreferrer">C++ 高级面试题答案合集</a></li>
<li><a href="https://www.mianshiya.com/user/1807760817992474626/answer?current=1" target="_blank" rel="noopener noreferrer">面试鸭公开答题记录</a></li>
<li><a href="https://github.com/chengxumiaodaren/cpp-learning" target="_blank" rel="noopener noreferrer">cpp-learning 公开资料导航</a></li>
</ul>
<p>部分入口可能要求登录。公开仓库与网站内容可以作为补充，但不代表其他配套内容也全部开放。</p>
<h2 id="四开源项目从会答走到会做" class="headerLink">
    <a href="#%e5%9b%9b%e5%bc%80%e6%ba%90%e9%a1%b9%e7%9b%ae%e4%bb%8e%e4%bc%9a%e7%ad%94%e8%b5%b0%e5%88%b0%e4%bc%9a%e5%81%9a" class="header-mark"></a>4 四、开源项目：从“会答”走到“会做”</h2><h3 id="buriedpoint埋点上报-sdkhttpsgithubcomcpptraininghubburiedpoint" class="headerLink">
    <a href="#buriedpoint%e5%9f%8b%e7%82%b9%e4%b8%8a%e6%8a%a5-sdkhttpsgithubcomcpptraininghubburiedpoint" class="header-mark"></a>4.1 <a href="https://github.com/CppTrainingHub/BuriedPoint" target="_blank" rel="noopener noreferrer">BuriedPoint：埋点上报 SDK</a></h3><p>仓库包含库实现、服务端、示例、测试和 CMake 配置，适合观察一个小型 C++ SDK 如何组织。阅读时可以沿着“初始化 → 启动 → 上报 → 持久化或发送”的调用链推进。</p>
<p>几个值得优先看的入口：</p>
<ul>
<li><a href="https://github.com/CppTrainingHub/BuriedPoint/blob/main/src/buried_core.cc" target="_blank" rel="noopener noreferrer">核心初始化与启动逻辑：buried_core.cc</a></li>
<li><a href="https://github.com/CppTrainingHub/BuriedPoint/blob/main/src/report/buried_report.cc" target="_blank" rel="noopener noreferrer">上报处理逻辑：buried_report.cc</a></li>
<li><a href="https://github.com/CppTrainingHub/BuriedPoint/blob/main/src/CMakeLists.txt" target="_blank" rel="noopener noreferrer">构建与依赖配置：src/CMakeLists.txt</a></li>
</ul>
<p>这个项目偏向 Windows/MSVC 环境。阅读源码时，可以重点检查对象生命周期、线程安全、失败重试，以及接口被错误调用时的边界处理。</p>
<h2 id="五推荐使用顺序" class="headerLink">
    <a href="#%e4%ba%94%e6%8e%a8%e8%8d%90%e4%bd%bf%e7%94%a8%e9%a1%ba%e5%ba%8f" class="header-mark"></a>5 五、推荐使用顺序</h2><ol>
<li>从“编程指北”或“huihut”选一个作为主线，先搭知识地图。</li>
<li>用面试鸭、拾光小舟和程序厨检查遗漏，但不要同时刷多个重复题库。</li>
<li>每遇到一道高频题，整理成“结论 → 机制 → 边界与取舍”三层回答。</li>
<li>最后选一个小项目跟调用链、编译运行，再脱离源码重写最小版本。</li>
</ol>
<p>资料会变化或失效；如果某个入口打不开，可以优先检查它对应的 GitHub 仓库或站点首页。</p>
]]></description></item><item><title>C 字符串与内存操作函数速查</title><link>https://soybeanmilk.netlify.app/c%E8%AF%AD%E8%A8%80%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8E%E5%86%85%E5%AD%98%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/c%E8%AF%AD%E8%A8%80%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8E%E5%86%85%E5%AD%98%E6%93%8D%E4%BD%9C%E5%87%BD%E6%95%B0/</guid><description><![CDATA[<h2 id="字符串内存操作函数速查" class="headerLink">
    <a href="#%e5%ad%97%e7%ac%a6%e4%b8%b2%e5%86%85%e5%ad%98%e6%93%8d%e4%bd%9c%e5%87%bd%e6%95%b0%e9%80%9f%e6%9f%a5" class="header-mark"></a>1 字符串/内存操作函数速查</h2><table>
  <thead>
      <tr>
          <th>函数</th>
          <th>参数说明</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>strlen(str)</code></td>
          <td><code>str</code> — 目标字符串</td>
          <td>计算字符串长度，不包含 <code>'\0'</code></td>
      </tr>
      <tr>
          <td><code>memmove(dst, src, n)</code></td>
          <td><code>dst</code> — 目标地址（destination）<br><code>src</code> — 源地址（source）<br><code>n</code> — 要移动的字节数</td>
          <td>移动 <code>n</code> 字节，<strong>允许内存区域重叠</strong></td>
      </tr>
      <tr>
          <td><code>memcpy(dst, src, n)</code></td>
          <td><code>dst</code> — 目标地址（destination）<br><code>src</code> — 源地址（source）<br><code>n</code> — 要复制的字节数</td>
          <td>复制 <code>n</code> 字节，<strong>不允许内存区域重叠</strong>（重叠时行为未定义）</td>
      </tr>
      <tr>
          <td><code>memset(dst, value, n)</code></td>
          <td><code>dst</code> — 目标地址（destination）<br><code>value</code> — 要填充的值（转为 unsigned char）<br><code>n</code> — 要填充的字节数</td>
          <td>将一段内存的每个字节填充为指定值</td>
      </tr>
      <tr>
          <td><code>strcpy(dst, src)</code></td>
          <td><code>dst</code> — 目标缓冲区（destination）<br><code>src</code> — 源字符串（source）</td>
          <td>复制 C 风格字符串，包括结尾的 <code>'\0'</code></td>
      </tr>
      <tr>
          <td><code>strcmp(a, b)</code></td>
          <td><code>a</code> — 字符串 A<br><code>b</code> — 字符串 B</td>
          <td>比较两个 C 风格字符串，相等返回 0</td>
      </tr>
      <tr>
          <td><code>strchr(str, ch)</code></td>
          <td><code>str</code> — 被搜索的字符串<br><code>ch</code> — 要查找的字符</td>
          <td>在字符串中查找字符，返回首次出现的位置指针</td>
      </tr>
      <tr>
          <td><code>strstr(str, sub)</code></td>
          <td><code>str</code> — 被搜索的字符串（haystack）<br><code>sub</code> — 要查找的子串（needle）</td>
          <td>在字符串中查找子串，返回首次出现的位置指针</td>
      </tr>
  </tbody>
</table>
<blockquote>
<p><strong>⚠️ 注意：</strong> <code>memmove</code> 和 <code>memcpy</code> 的区别——当 <code>src</code> 和 <code>dst</code> 的内存区域有重叠时，必须用 <code>memmove</code>，因为它会先拷贝到临时缓冲区再写入，保证正确性；<code>memcpy</code> 不处理重叠情况，可能导致数据损坏。</p></blockquote>
<table>
  <thead>
      <tr>
          <th>函数名</th>
          <th>全称拆分</th>
          <th>英文原意</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><strong>strlen</strong></td>
          <td>str = string；len = length</td>
          <td><strong>string length</strong> 字符串长度</td>
      </tr>
      <tr>
          <td><strong>memmove</strong></td>
          <td>mem = memory；move</td>
          <td><strong>memory move</strong> 内存移动</td>
      </tr>
      <tr>
          <td><strong>memcpy</strong></td>
          <td>mem = memory；cpy = copy</td>
          <td><strong>memory copy</strong> 内存复制</td>
      </tr>
      <tr>
          <td><strong>memset</strong></td>
          <td>mem = memory；set</td>
          <td><strong>memory set</strong> 内存填充</td>
      </tr>
      <tr>
          <td><strong>strcpy</strong></td>
          <td>str = string；cpy = copy</td>
          <td><strong>string copy</strong> 字符串复制</td>
      </tr>
      <tr>
          <td><strong>strcmp</strong></td>
          <td>str = string；cmp = compare</td>
          <td><strong>string compare</strong> 字符串比较</td>
      </tr>
      <tr>
          <td><strong>strchr</strong></td>
          <td>str = string；chr = character</td>
          <td><strong>string character</strong> 在字符串查找字符</td>
      </tr>
      <tr>
          <td><strong>strstr</strong></td>
          <td>str = string；第二个 str = substring</td>
          <td><strong>string substring</strong> 在字符串查找子串</td>
      </tr>
  </tbody>
</table>
<h2 id="补充规律方便记忆" class="headerLink">
    <a href="#%e8%a1%a5%e5%85%85%e8%a7%84%e5%be%8b%e6%96%b9%e4%be%bf%e8%ae%b0%e5%bf%86" class="header-mark"></a>2 补充规律（方便记忆）</h2><ol>
<li><strong><code>str</code> 开头 → 只处理「C 风格字符串」</strong>，依赖 <code>\0</code> 结束标记；</li>
<li><strong><code>mem</code> 开头 → 纯粹操作内存块</strong>，不识别字符串结束符，按字节数量处理；</li>
<li>通用缩写约定：
<ul>
<li><code>cpy</code> = copy</li>
<li><code>cmp</code> = compare</li>
<li><code>chr</code> = character</li>
<li><code>len</code> = length</li>
<li><code>sub</code> = substring</li>
</ul>
</li>
</ol>
]]></description></item><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><item><title>C++14 新特性</title><link>https://soybeanmilk.netlify.app/cpp14%E6%96%B0%E7%89%B9%E6%80%A7/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp14%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++14 是 C++11 的小版本更新，主要是完善和补充，核心特性不多但很实用。</p></blockquote>
<hr>
<h2 id="一函数返回值类型推导" class="headerLink">
    <a href="#%e4%b8%80%e5%87%bd%e6%95%b0%e8%bf%94%e5%9b%9e%e5%80%bc%e7%b1%bb%e5%9e%8b%e6%8e%a8%e5%af%bc" class="header-mark"></a>1 一、函数返回值类型推导</h2><p>C++11 只有 lambda 可以用 <code>auto</code> 推导返回值，C++14 扩展到所有函数：</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><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></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">// C++14：自动推导返回 int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</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">// 多个 return 必须类型一致
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="nf">f</span><span class="p">(</span><span class="kt">bool</span> <span class="n">flag</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="n">flag</span><span class="p">)</span> <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>    <span class="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">else</span> <span class="k">return</span> <span class="mi">2</span><span class="p">;</span>         <span class="c1">// OK，都是 int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="c1">// return 3.14;        // ERROR，类型不一致
</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><p><strong>注意：</strong></p>
<ul>
<li>递归函数不能用 auto 返回值推导（除非先有前置声明）</li>
<li>有多个 return 语句时，所有 return 的类型必须相同</li>
</ul>
<hr>
<h2 id="二泛型-lambdageneric-lambda" class="headerLink">
    <a href="#%e4%ba%8c%e6%b3%9b%e5%9e%8b-lambdageneric-lambda" class="header-mark"></a>2 二、泛型 lambda（Generic Lambda）</h2><p>C++11 的 lambda 参数必须写具体类型，C++14 可以用 <code>auto</code>：</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><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</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">// C++14：参数用 auto，相当于模板函数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="n">add</span> <span class="o">=</span> <span class="p">[](</span><span class="k">auto</span> <span class="n">a</span><span class="p">,</span> <span class="k">auto</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</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="n">add</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="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">add</span><span class="p">(</span><span class="mf">1.5</span><span class="p">,</span> <span class="mf">2.3</span><span class="p">);</span>   <span class="c1">// double
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">add</span><span class="p">(</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;a&#34;</span><span class="p">),</span> <span class="n">string</span><span class="p">(</span><span class="s">&#34;b&#34;</span><span class="p">));</span>  <span class="c1">// string
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>本质：</strong> 编译器自动生成一个模板函数对象。</p>
<hr>
<h2 id="三变量模板variable-templates" class="headerLink">
    <a href="#%e4%b8%89%e5%8f%98%e9%87%8f%e6%a8%a1%e6%9d%bfvariable-templates" class="header-mark"></a>3 三、变量模板（Variable Templates）</h2><p>之前只有类模板、函数模板，C++14 新增变量模板：</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><span class="lnt">6
</span><span class="lnt">7
</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">// 定义一个 pi 变量模板
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">constexpr</span> <span class="n">T</span> <span class="n">pi</span> <span class="o">=</span> <span class="n">T</span><span class="p">(</span><span class="mf">3.1415926535897932385</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 使用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">float</span>  <span class="n">r1</span> <span class="o">=</span> <span class="n">pi</span><span class="o">&lt;</span><span class="kt">float</span><span class="o">&gt;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">double</span> <span class="n">r2</span> <span class="o">=</span> <span class="n">pi</span><span class="o">&lt;</span><span class="kt">double</span><span class="o">&gt;</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>最经典的应用：<code>std::is_same_v&lt;T, U&gt;</code> 就是 C++17 基于变量模板做的。</p>
<hr>
<h2 id="四聚合初始化增强" class="headerLink">
    <a href="#%e5%9b%9b%e8%81%9a%e5%90%88%e5%88%9d%e5%a7%8b%e5%8c%96%e5%a2%9e%e5%bc%ba" class="header-mark"></a>4 四、聚合初始化增强</h2><p>C++14 允许聚合体中含有默认成员初始化器时，仍然可以用花括号初始化：</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><span class="lnt">6
</span><span class="lnt">7
</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="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</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="n">Point</span> <span class="n">p1</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="c1">// C++11 不允许，C++14 可以
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">Point</span> <span class="n">p2</span><span class="p">{};</span>      <span class="c1">// x=0, y=0，用默认值
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="五decltypeauto" class="headerLink">
    <a href="#%e4%ba%94decltypeauto" class="header-mark"></a>5 五、<code>decltype(auto)</code></h2><p>解决转发函数的返回值问题：</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="c1">// 用 auto 会丢失引用
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="nf">f1</span><span class="p">()</span> <span class="o">-&gt;</span> <span class="k">decltype</span><span class="p">(</span><span class="n">expr</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">expr</span><span class="p">;</span> <span class="p">}</span>  <span class="c1">// C++11 写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// C++14 简化写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">decltype</span><span class="p">(</span><span class="k">auto</span><span class="p">)</span> <span class="n">f2</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">expr</span><span class="p">;</span> <span class="p">}</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>区别：</strong></p>
<ul>
<li><code>auto</code>：会去掉引用和顶层 const</li>
<li><code>decltype(auto)</code>：完美保留表达式的原始类型</li>
</ul>
<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="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="kt">int</span><span class="o">&amp;</span> <span class="n">ref</span> <span class="o">=</span> <span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">a</span> <span class="o">=</span> <span class="n">ref</span><span class="p">;</span>            <span class="c1">// int
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">decltype</span><span class="p">(</span><span class="k">auto</span><span class="p">)</span> <span class="n">b</span> <span class="o">=</span> <span class="n">ref</span><span class="p">;</span>  <span class="c1">// int&amp;
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六标准库新增" class="headerLink">
    <a href="#%e5%85%ad%e6%a0%87%e5%87%86%e5%ba%93%e6%96%b0%e5%a2%9e" class="header-mark"></a>6 六、标准库新增</h2><h3 id="61-stdmake_unique" class="headerLink">
    <a href="#61-stdmake_unique" class="header-mark"></a>6.1 6.1 <code>std::make_unique</code></h3><p>C++11 有 <code>make_shared</code> 但漏掉了 <code>make_unique</code>，C++14 补上：</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></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="k">auto</span> <span class="n">p</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_unique</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span><span class="p">(</span><span class="mi">42</span><span class="p">);</span>  <span class="c1">// 推荐，比 new 安全
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="62-stdshared_timed_mutex" class="headerLink">
    <a href="#62-stdshared_timed_mutex" class="header-mark"></a>6.2 6.2 <code>std::shared_timed_mutex</code></h3><p>读写锁的超时版本，C++17 又加了 <code>shared_mutex</code>。</p>
<h3 id="63-整数序列-stdinteger_sequence" class="headerLink">
    <a href="#63-%e6%95%b4%e6%95%b0%e5%ba%8f%e5%88%97-stdinteger_sequence" class="header-mark"></a>6.3 6.3 整数序列 <code>std::integer_sequence</code></h3><p>模板元编程工具，用于展开参数包：</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></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="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="p">,</span> <span class="n">T</span><span class="p">...</span> <span class="n">Is</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">struct</span> <span class="nc">integer_sequence</span> <span class="p">{</span> <span class="p">...</span> <span class="p">};</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>日常开发用得少，库作者用得多。</p>
<h3 id="64-stdexchange" class="headerLink">
    <a href="#64-stdexchange" class="header-mark"></a>6.4 6.4 <code>std::exchange</code></h3><p>赋值并返回旧值：</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></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">std</span><span class="o">::</span><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">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></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">old</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">exchange</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">});</span>
</span></span><span class="line"><span class="cl"><span class="c1">// old = {1,2,3}, v = {4,5,6}
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="七其他小特性" class="headerLink">
    <a href="#%e4%b8%83%e5%85%b6%e4%bb%96%e5%b0%8f%e7%89%b9%e6%80%a7" class="header-mark"></a>7 七、其他小特性</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>二进制字面量</td>
          <td><code>0b1010</code> 表示十进制 10</td>
      </tr>
      <tr>
          <td>数字分隔符</td>
          <td><code>1'000'000</code> 可读性更好</td>
      </tr>
      <tr>
          <td>lambda 初始化捕获</td>
          <td>C++14 可以在捕获列表里初始化新变量</td>
      </tr>
  </tbody>
</table>
<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></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">// 初始化捕获（init capture）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">f</span> <span class="o">=</span> <span class="p">[</span><span class="n">y</span> <span class="o">=</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]()</span> <span class="p">{</span> <span class="k">return</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span>  <span class="c1">// y = 11
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="总结" class="headerLink">
    <a href="#%e6%80%bb%e7%bb%93" class="header-mark"></a>8 总结</h2><p>C++14 是一个<strong>过渡版本</strong>，特性不多但都很实用：</p>
<ul>
<li><strong>函数返回值 auto</strong>：写起来更简洁</li>
<li><strong>泛型 lambda</strong>：配合 auto 参数，写算法更方便</li>
<li><strong>decltype(auto)</strong>：完美转发返回值</li>
<li><strong>make_unique</strong>：终于补上了</li>
<li><strong>变量模板</strong>：为后续标准库简化铺路</li>
</ul>
]]></description></item><item><title>C++17 新特性</title><link>https://soybeanmilk.netlify.app/cpp17%E6%96%B0%E7%89%B9%E6%80%A7/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp17%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++17 是一个大版本，引入了很多实用特性，被称为「最舒服的 C++ 版本」。</p></blockquote>
<hr>
<h2 id="一结构化绑定structured-bindings" class="headerLink">
    <a href="#%e4%b8%80%e7%bb%93%e6%9e%84%e5%8c%96%e7%bb%91%e5%ae%9astructured-bindings" class="header-mark"></a>1 一、结构化绑定（Structured Bindings）⭐</h2><p>最常用的特性之一，一键解包 tuple/struct/数组：</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><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><span class="lnt">14
</span><span class="lnt">15
</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">// 解包 pair
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">getPerson</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="p">{</span><span class="mi">25</span><span class="p">,</span> <span class="s">&#34;Tom&#34;</span><span class="p">};</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="p">[</span><span class="n">age</span><span class="p">,</span> <span class="n">name</span><span class="p">]</span> <span class="o">=</span> <span class="n">getPerson</span><span class="p">();</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 解包 tuple
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">make_tuple</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">,</span> <span class="s">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 解包 struct
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">struct</span> <span class="nc">Point</span> <span class="p">{</span> <span class="kt">int</span> <span class="n">x</span><span class="p">;</span> <span class="kt">int</span> <span class="n">y</span><span class="p">;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">p</span><span class="p">{</span><span class="mi">10</span><span class="p">,</span> <span class="mi">20</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="p">[</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">]</span> <span class="o">=</span> <span class="n">p</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 解包数组
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">arr</span><span class="p">[]</span> <span class="o">=</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></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="p">[</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">c</span><span class="p">]</span> <span class="o">=</span> <span class="n">arr</span><span class="p">;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>结合 map 遍历超好用：</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-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">map</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span> <span class="n">m</span> <span class="o">=</span> <span class="p">{{</span><span class="mi">1</span><span class="p">,</span> <span class="s">&#34;a&#34;</span><span class="p">},</span> <span class="p">{</span><span class="mi">2</span><span class="p">,</span> <span class="s">&#34;b&#34;</span><span class="p">}};</span>
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="k">const</span> <span class="k">auto</span><span class="o">&amp;</span> <span class="p">[</span><span class="n">key</span><span class="p">,</span> <span class="n">value</span><span class="p">]</span> <span class="o">:</span> <span class="n">m</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">key</span> <span class="o">&lt;&lt;</span> <span class="s">&#34;: &#34;</span> <span class="o">&lt;&lt;</span> <span class="n">value</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><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><p><strong>实战（Q347 前 K 个高频元素）：</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><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></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">// 传统写法：p.first / p.second 访问键值对
</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="o">&amp;</span> <span class="nl">p</span> <span class="p">:</span> <span class="n">u_map</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">vec</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">p</span><span class="p">.</span><span class="n">second</span><span class="p">,</span> <span class="n">p</span><span class="p">.</span><span class="n">first</span><span class="p">});</span>   <span class="c1">// p.first 是数字，p.second 是次数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><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="k">auto</span><span class="o">&amp;</span> <span class="p">[</span><span class="n">num</span><span class="p">,</span> <span class="n">cnt</span><span class="p">]</span> <span class="o">:</span> <span class="n">u_map</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">vec</span><span class="p">.</span><span class="n">push_back</span><span class="p">({</span><span class="n">cnt</span><span class="p">,</span> <span class="n">num</span><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><p>注意：LeetCode 默认 C++17，可以直接用 <code>auto [num, cnt]</code>；本地老编译器（C++14 及以下）不支持。</p>
<hr>
<h2 id="二if--switch-初始化语句" class="headerLink">
    <a href="#%e4%ba%8cif--switch-%e5%88%9d%e5%a7%8b%e5%8c%96%e8%af%ad%e5%8f%a5" class="header-mark"></a>2 二、<code>if</code> / <code>switch</code> 初始化语句</h2><p>在 if 条件里定义变量，缩小作用域：</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><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></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">// C++17 写法
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span> <span class="p">(</span><span class="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">m</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">key</span><span class="p">);</span> <span class="n">it</span> <span class="o">!=</span> <span class="n">m</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="p">{</span>
</span></span><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="p">}</span>
</span></span><span class="line"><span class="cl"><span class="c1">// it 在这里已经不可见了
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// switch 同理
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">switch</span> <span class="p">(</span><span class="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="n">getValue</span><span class="p">();</span> <span class="n">val</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="mi">1</span><span class="o">:</span> <span class="p">...</span>
</span></span><span class="line"><span class="cl">    <span class="k">case</span> <span class="mi">2</span><span class="o">:</span> <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="三内联变量inline-variables" class="headerLink">
    <a href="#%e4%b8%89%e5%86%85%e8%81%94%e5%8f%98%e9%87%8finline-variables" class="header-mark"></a>3 三、内联变量（Inline Variables）</h2><p>解决了「全局变量在头文件里定义导致多重定义」的老问题：</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><span class="lnt">6
</span><span class="lnt">7
</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">// 头文件中，C++17 之前会报重复定义
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kr">inline</span> <span class="k">constexpr</span> <span class="kt">int</span> <span class="n">MAX_SIZE</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 静态成员变量也可以直接在类内初始化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">class</span> <span class="nc">MyClass</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kr">inline</span> <span class="k">static</span> <span class="kt">int</span> <span class="n">count</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>  <span class="c1">// C++17 不需要在 .cpp 里再定义一次
</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="四折叠表达式fold-expressions" class="headerLink">
    <a href="#%e5%9b%9b%e6%8a%98%e5%8f%a0%e8%a1%a8%e8%be%be%e5%bc%8ffold-expressions" class="header-mark"></a>4 四、折叠表达式（Fold Expressions）</h2><p>简化可变参数模板的展开：</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><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">// 对所有参数求和
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span><span class="p">...</span> <span class="n">Args</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">sum</span><span class="p">(</span><span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="p">(...</span> <span class="o">+</span> <span class="n">args</span><span class="p">);</span>  <span class="c1">// 一元右折叠：((a1 + a2) + a3) + ...
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">sum</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">// = 10
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// 带初始值的折叠
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span><span class="p">...</span> <span class="n">Args</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="kt">void</span> <span class="n">printAll</span><span class="p">(</span><span class="n">Args</span><span class="p">...</span> <span class="n">args</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="p">...</span> <span class="o">&lt;&lt;</span> <span class="n">args</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><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><p>四种折叠形式：</p>
<ul>
<li><code>(... op args)</code> 一元右折叠</li>
<li><code>(args op ...)</code> 一元左折叠</li>
<li><code>(init op ... op args)</code> 二元右折叠</li>
<li><code>(args op ... op init)</code> 二元左折叠</li>
</ul>
<hr>
<h2 id="五constexpr-增强" class="headerLink">
    <a href="#%e4%ba%94constexpr-%e5%a2%9e%e5%bc%ba" class="header-mark"></a>5 五、<code>constexpr</code> 增强</h2><p>C++17 中 constexpr 可以用的地方更多了：</p>
<h3 id="51-constexpr-if" class="headerLink">
    <a href="#51-constexpr-if" class="header-mark"></a>5.1 5.1 constexpr if</h3><p>编译期条件判断，替代部分 SFINAE 写法：</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><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</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="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">getValue</span><span class="p">(</span><span class="n">T</span> <span class="n">x</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">if</span> <span class="nf">constexpr</span> <span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">is_integral_v</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">return</span> <span class="n">x</span> <span class="o">+</span> <span class="mi">1</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="k">return</span> <span class="n">x</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><h3 id="52-constexpr-lambda" class="headerLink">
    <a href="#52-constexpr-lambda" class="header-mark"></a>5.2 5.2 constexpr lambda</h3><p>lambda 可以在编译期执行：</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></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="k">constexpr</span> <span class="k">auto</span> <span class="n">square</span> <span class="o">=</span> <span class="p">[](</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">n</span><span class="p">;</span> <span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="k">static_assert</span><span class="p">(</span><span class="n">square</span><span class="p">(</span><span class="mi">5</span><span class="p">)</span> <span class="o">==</span> <span class="mi">25</span><span class="p">);</span>  <span class="c1">// 编译期计算
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六类模板参数推导ctad" class="headerLink">
    <a href="#%e5%85%ad%e7%b1%bb%e6%a8%a1%e6%9d%bf%e5%8f%82%e6%95%b0%e6%8e%a8%e5%af%bcctad" class="header-mark"></a>6 六、类模板参数推导（CTAD）</h2><p>构造模板类时不用写模板参数，编译器自动推导：</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><span class="lnt">6
</span><span class="lnt">7
</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">// C++11/14：必须写参数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">pair</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">double</span><span class="o">&gt;</span> <span class="n">p1</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><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="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></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// C++17：自动推导
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">pair</span> <span class="n">p2</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mf">2.5</span><span class="p">);</span>     <span class="c1">// pair&lt;int, double&gt;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">vector</span> <span class="n">v2</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="c1">// vector&lt;int&gt;
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="七标准库新增容器" class="headerLink">
    <a href="#%e4%b8%83%e6%a0%87%e5%87%86%e5%ba%93%e6%96%b0%e5%a2%9e%e5%ae%b9%e5%99%a8" class="header-mark"></a>7 七、标准库新增容器</h2><h3 id="71-stdoptional" class="headerLink">
    <a href="#71-stdoptional" class="header-mark"></a>7.1 7.1 <code>std::optional</code></h3><p>表示「可能有值，可能为空」，替代指针判空：</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><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></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">std</span><span class="o">::</span><span class="n">optional</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">findNum</span><span class="p">(</span><span class="kt">int</span> <span class="n">x</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="n">x</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="k">return</span> <span class="n">x</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">std</span><span class="o">::</span><span class="n">nullopt</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><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">res</span> <span class="o">=</span> <span class="n">findNum</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">res</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="o">*</span><span class="n">res</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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">// 有值返回，没值返回默认
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">val</span> <span class="o">=</span> <span class="n">findNum</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">).</span><span class="n">value_or</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="72-stdvariant" class="headerLink">
    <a href="#72-stdvariant" class="header-mark"></a>7.2 7.2 <code>std::variant</code></h3><p>类型安全的 union，访问时用 <code>std::visit</code>：</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><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</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">std</span><span class="o">::</span><span class="n">variant</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</span> <span class="kt">double</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">string</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="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span> <span class="o">=</span> <span class="mf">3.14</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">v</span> <span class="o">=</span> <span class="s">&#34;hello&#34;</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">visit</span><span class="p">([](</span><span class="k">auto</span><span class="o">&amp;&amp;</span> <span class="n">arg</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">arg</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="p">},</span> <span class="n">v</span><span class="p">);</span>
</span></span></code></pre></td></tr></table>
</div>
</div><h3 id="73-stdany" class="headerLink">
    <a href="#73-stdany" class="header-mark"></a>7.3 7.3 <code>std::any</code></h3><p>可以存任意类型的容器，类似 <code>void*</code> 但类型安全：</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><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">std</span><span class="o">::</span><span class="n">any</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">a</span><span class="p">.</span><span class="n">type</span><span class="p">()</span> <span class="o">==</span> <span class="k">typeid</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">any_cast</span><span class="o">&lt;</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&gt;</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><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="八stdstring_view" class="headerLink">
    <a href="#%e5%85%abstdstring_view" class="header-mark"></a>8 八、<code>std::string_view</code></h2><p>字符串的「视图」，不持有数据，零拷贝：</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><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="kt">void</span> <span class="nf">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string_view</span> <span class="n">sv</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// 传 const char* 或 std::string 都不用拷贝
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">sv</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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="n">print</span><span class="p">(</span><span class="s">&#34;hello&#34;</span><span class="p">);</span>           <span class="c1">// OK
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">print</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="p">(</span><span class="s">&#34;hi&#34;</span><span class="p">));</span> <span class="c1">// OK
</span></span></span></code></pre></td></tr></table>
</div>
</div><p><strong>注意：</strong> string_view 不拥有数据，源字符串销毁后就悬空了。</p>
<hr>
<h2 id="九文件系统库-stdfilesystem" class="headerLink">
    <a href="#%e4%b9%9d%e6%96%87%e4%bb%b6%e7%b3%bb%e7%bb%9f%e5%ba%93-stdfilesystem" class="header-mark"></a>9 九、文件系统库 <code>std::filesystem</code></h2><p>终于有了标准的文件操作库：</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><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><span class="lnt">14
</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="cp">#include</span> <span class="cpf">&lt;filesystem&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span><span class="k">namespace</span> <span class="n">fs</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">filesystem</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 创建目录
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">fs</span><span class="o">::</span><span class="n">create_directory</span><span class="p">(</span><span class="s">&#34;test&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><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="k">auto</span><span class="o">&amp;</span> <span class="nl">entry</span> <span class="p">:</span> <span class="n">fs</span><span class="o">::</span><span class="n">directory_iterator</span><span class="p">(</span><span class="s">&#34;.&#34;</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">entry</span><span class="p">.</span><span class="n">path</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</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">// 文件大小、路径操作
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="n">size</span> <span class="o">=</span> <span class="n">fs</span><span class="o">::</span><span class="n">file_size</span><span class="p">(</span><span class="s">&#34;test.txt&#34;</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">auto</span> <span class="n">ext</span> <span class="o">=</span> <span class="n">fs</span><span class="o">::</span><span class="n">path</span><span class="p">(</span><span class="s">&#34;test.txt&#34;</span><span class="p">).</span><span class="n">extension</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="十其他实用特性" class="headerLink">
    <a href="#%e5%8d%81%e5%85%b6%e4%bb%96%e5%ae%9e%e7%94%a8%e7%89%b9%e6%80%a7" class="header-mark"></a>10 十、其他实用特性</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>[[nodiscard]]</code></td>
          <td>标记返回值不能忽略，编译器会警告</td>
      </tr>
      <tr>
          <td><code>[[maybe_unused]]</code></td>
          <td>标记可能不用的变量，消除警告</td>
      </tr>
      <tr>
          <td><code>[[fallthrough]]</code></td>
          <td>switch 中显式标注故意 fall-through</td>
      </tr>
      <tr>
          <td>十六进制浮点字面量</td>
          <td><code>0x1.2p3</code></td>
      </tr>
      <tr>
          <td><code>std::as_const</code></td>
          <td>把左值转成 const 引用</td>
      </tr>
      <tr>
          <td><code>std::clamp</code></td>
          <td>把值限制在区间内 <code>clamp(val, min, max)</code></td>
      </tr>
  </tbody>
</table>
<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></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">// [[nodiscard]] 示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="na">[[nodiscard]]</span> <span class="kt">int</span> <span class="n">compute</span><span class="p">()</span> <span class="p">{</span> <span class="k">return</span> <span class="mi">42</span><span class="p">;</span> <span class="p">}</span>
</span></span><span class="line"><span class="cl"><span class="n">compute</span><span class="p">();</span>  <span class="c1">// 警告：返回值被忽略
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="总结" class="headerLink">
    <a href="#%e6%80%bb%e7%bb%93" class="header-mark"></a>11 总结</h2><p>C++17 是<strong>日常开发提升幸福感最多的版本</strong>：</p>
<ul>
<li>结构化绑定 + if-init：代码更简洁</li>
<li>optional/variant/any：类型安全三件套</li>
<li>string_view：字符串处理性能提升</li>
<li>filesystem：终于不用自己写文件操作了</li>
<li>constexpr if：模板元编程变得可读</li>
</ul>
]]></description></item><item><title>C++20 新特性</title><link>https://soybeanmilk.netlify.app/cpp20%E6%96%B0%E7%89%B9%E6%80%A7/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/cpp20%E6%96%B0%E7%89%B9%E6%80%A7/</guid><description><![CDATA[<blockquote>
<p>C++20 是继 C++11 以来最大的版本更新，四大天王：Concepts、Ranges、Coroutines、Modules。</p></blockquote>
<hr>
<h2 id="一概念concepts" class="headerLink">
    <a href="#%e4%b8%80%e6%a6%82%e5%bf%b5concepts" class="header-mark"></a>1 一、概念（Concepts）⭐</h2><p>给模板参数加约束，让模板报错不再是天书：</p>
<h3 id="11-基础用法" class="headerLink">
    <a href="#11-%e5%9f%ba%e7%a1%80%e7%94%a8%e6%b3%95" class="header-mark"></a>1.1 1.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><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></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">// 定义一个概念：T 必须是可加的
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">concept</span> <span class="n">Addable</span> <span class="o">=</span> <span class="k">requires</span><span class="p">(</span><span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">T</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">{</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span> <span class="p">}</span> <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">same_as</span><span class="o">&lt;</span><span class="n">T</span><span class="o">&gt;</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">// 使用概念约束模板参数
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">template</span><span class="o">&lt;</span><span class="n">Addable</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="n">T</span> <span class="n">add</span><span class="p">(</span><span class="n">T</span> <span class="n">a</span><span class="p">,</span> <span class="n">T</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><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><h3 id="12-requires-表达式" class="headerLink">
    <a href="#12-requires-%e8%a1%a8%e8%be%be%e5%bc%8f" class="header-mark"></a>1.2 1.2 requires 表达式</h3><p>四种约束形式：</p>
<ul>
<li><strong>简单约束</strong>：<code>sizeof(T) == 4</code></li>
<li><strong>类型约束</strong>：<code>std::integral&lt;T&gt;</code></li>
<li><strong>复合约束</strong>：<code>{ expr } -&gt; 类型概念</code></li>
<li><strong>嵌套约束</strong>：<code>requires { ... }</code></li>
</ul>
<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></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="k">template</span><span class="o">&lt;</span><span class="k">typename</span> <span class="n">T</span><span class="o">&gt;</span>
</span></span><span class="line"><span class="cl"><span class="k">concept</span> <span class="n">Container</span> <span class="o">=</span> <span class="k">requires</span><span class="p">(</span><span class="n">T</span> <span class="n">c</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">c</span><span class="p">.</span><span class="n">begin</span><span class="p">();</span>       <span class="c1">// 必须有 begin()
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="n">c</span><span class="p">.</span><span class="n">end</span><span class="p">();</span>         <span class="c1">// 必须有 end()
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">typename</span> <span class="n">T</span><span class="o">::</span><span class="n">value_type</span><span class="p">;</span>  <span class="c1">// 必须有 value_type 类型
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="p">{</span> <span class="n">c</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="p">}</span> <span class="o">-&gt;</span> <span class="n">std</span><span class="o">::</span><span class="n">convertible_to</span><span class="o">&lt;</span><span class="n">size_t</span><span class="o">&gt;</span><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><h3 id="13-标准库内置概念" class="headerLink">
    <a href="#13-%e6%a0%87%e5%87%86%e5%ba%93%e5%86%85%e7%bd%ae%e6%a6%82%e5%bf%b5" class="header-mark"></a>1.3 1.3 标准库内置概念</h3><p><code>&lt;concepts&gt;</code> 头文件里提供了一堆：</p>
<ul>
<li><code>std::same_as&lt;T, U&gt;</code> — 类型相同</li>
<li><code>std::derived_from&lt;Derived, Base&gt;</code> — 派生关系</li>
<li><code>std::convertible_to&lt;From, To&gt;</code> — 可转换</li>
<li><code>std::integral&lt;T&gt;</code> — 整型</li>
<li><code>std::floating_point&lt;T&gt;</code> — 浮点型</li>
<li><code>std::ranges::range&lt;T&gt;</code> — 范围</li>
</ul>
<hr>
<h2 id="二范围库ranges" class="headerLink">
    <a href="#%e4%ba%8c%e8%8c%83%e5%9b%b4%e5%ba%93ranges" class="header-mark"></a>2 二、范围库（Ranges）⭐</h2><p>彻底改变 STL 算法的写法，支持链式调用：</p>
<h3 id="21-管道式写法" class="headerLink">
    <a href="#21-%e7%ae%a1%e9%81%93%e5%bc%8f%e5%86%99%e6%b3%95" class="header-mark"></a>2.1 2.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><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><span class="lnt">14
</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="cp">#include</span> <span class="cpf">&lt;ranges&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">nums</span> <span class="o">=</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="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">};</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// C++17：嵌套调用，可读性差
</span></span></span><span class="line"><span class="cl"><span class="c1">// C++20：管道式，从左到右读
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">auto</span> <span class="n">result</span> <span class="o">=</span> <span class="n">nums</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">filter</span><span class="p">([](</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">%</span> <span class="mi">2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span> <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">transform</span><span class="p">([](</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="mi">2</span><span class="p">;</span> <span class="p">})</span>
</span></span><span class="line"><span class="cl">    <span class="o">|</span> <span class="n">std</span><span class="o">::</span><span class="n">views</span><span class="o">::</span><span class="n">take</span><span class="p">(</span><span class="mi">3</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">result</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><span class="p">;</span>  <span class="c1">// 4 8 12
</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><h3 id="22-常用视图适配器" class="headerLink">
    <a href="#22-%e5%b8%b8%e7%94%a8%e8%a7%86%e5%9b%be%e9%80%82%e9%85%8d%e5%99%a8" class="header-mark"></a>2.2 2.2 常用视图适配器</h3><table>
  <thead>
      <tr>
          <th>适配器</th>
          <th>作用</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>views::filter</code></td>
          <td>过滤</td>
      </tr>
      <tr>
          <td><code>views::transform</code></td>
          <td>转换映射</td>
      </tr>
      <tr>
          <td><code>views::take(n)</code></td>
          <td>取前 n 个</td>
      </tr>
      <tr>
          <td><code>views::drop(n)</code></td>
          <td>跳过前 n 个</td>
      </tr>
      <tr>
          <td><code>views::reverse</code></td>
          <td>反转</td>
      </tr>
      <tr>
          <td><code>views::keys</code> / <code>values</code></td>
          <td>取 pair 的 key/value</td>
      </tr>
      <tr>
          <td><code>views::join</code></td>
          <td>扁平化</td>
      </tr>
      <tr>
          <td><code>views::split</code></td>
          <td>分割</td>
      </tr>
  </tbody>
</table>
<h3 id="23-惰性求值" class="headerLink">
    <a href="#23-%e6%83%b0%e6%80%a7%e6%b1%82%e5%80%bc" class="header-mark"></a>2.3 2.3 惰性求值</h3><p>views 不会立即计算，只有在迭代时才生成元素，性能更好。</p>
<hr>
<h2 id="三协程coroutines" class="headerLink">
    <a href="#%e4%b8%89%e5%8d%8f%e7%a8%8bcoroutines" class="header-mark"></a>3 三、协程（Coroutines）</h2><p>函数可以暂停和恢复，异步编程神器：</p>
<h3 id="31-三个新关键字" class="headerLink">
    <a href="#31-%e4%b8%89%e4%b8%aa%e6%96%b0%e5%85%b3%e9%94%ae%e5%ad%97" class="header-mark"></a>3.1 3.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></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="k">co_await</span>   <span class="c1">// 暂停，等待异步操作
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">co_return</span>  <span class="c1">// 返回值并结束
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">co_yield</span>   <span class="c1">// 返回一个值并暂停，下次从这里继续
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="32-生成器示例" class="headerLink">
    <a href="#32-%e7%94%9f%e6%88%90%e5%99%a8%e7%a4%ba%e4%be%8b" class="header-mark"></a>3.2 3.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><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><span class="lnt">14
</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">generator</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">fibonacci</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="mi">0</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <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="n">n</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">        <span class="k">co_yield</span> <span class="n">b</span><span class="p">;</span>   <span class="c1">// 返回 b，暂停在这里
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>        <span class="kt">int</span> <span class="n">next</span> <span class="o">=</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">a</span> <span class="o">=</span> <span class="n">b</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">        <span class="n">b</span> <span class="o">=</span> <span class="n">next</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><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><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="nl">x</span> <span class="p">:</span> <span class="n">fibonacci</span><span class="p">(</span><span class="mi">10</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</span><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><h3 id="33-异步任务" class="headerLink">
    <a href="#33-%e5%bc%82%e6%ad%a5%e4%bb%bb%e5%8a%a1" class="header-mark"></a>3.3 3.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></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">task</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">fetchData</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">auto</span> <span class="n">data</span> <span class="o">=</span> <span class="k">co_await</span> <span class="n">asyncLoad</span><span class="p">();</span>  <span class="c1">// 暂停，不阻塞线程
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>    <span class="k">co_return</span> <span class="n">data</span><span class="p">.</span><span class="n">size</span><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><blockquote>
<p>注意：标准库只提供了协程机制，没有提供具体的协程类型（task/generator），需要自己实现或用第三方库（如 cppcoro）。C++23 才补了 <code>std::generator</code>。</p></blockquote>
<hr>
<h2 id="四模块modules" class="headerLink">
    <a href="#%e5%9b%9b%e6%a8%a1%e5%9d%97modules" class="header-mark"></a>4 四、模块（Modules）</h2><p>告别 <code>#include</code>，解决头文件地狱：</p>
<h3 id="41-定义模块" class="headerLink">
    <a href="#41-%e5%ae%9a%e4%b9%89%e6%a8%a1%e5%9d%97" class="header-mark"></a>4.1 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><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></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">// math.ixx （模块接口文件）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">export</span> <span class="n">module</span> <span class="n">math</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="k">export</span> <span class="kt">int</span> <span class="nf">add</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">a</span> <span class="o">+</span> <span class="n">b</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="k">export</span> <span class="k">namespace</span> <span class="n">math_utils</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="nf">mul</span><span class="p">(</span><span class="kt">int</span> <span class="n">a</span><span class="p">,</span> <span class="kt">int</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span> <span class="k">return</span> <span class="n">a</span> <span class="o">*</span> <span class="n">b</span><span class="p">;</span> <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><h3 id="42-导入模块" class="headerLink">
    <a href="#42-%e5%af%bc%e5%85%a5%e6%a8%a1%e5%9d%97" class="header-mark"></a>4.2 4.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="n">import</span> <span class="n">math</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="n">add</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
</span></span><span class="line"><span class="cl">    <span class="n">math_utils</span><span class="o">::</span><span class="n">mul</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><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><p><strong>优点：</strong></p>
<ul>
<li>编译速度大幅提升（只编译一次）</li>
<li>没有宏污染</li>
<li>模块内部的东西默认不导出，封装更好</li>
</ul>
<hr>
<h2 id="五三路比较运算符-" class="headerLink">
    <a href="#%e4%ba%94%e4%b8%89%e8%b7%af%e6%af%94%e8%be%83%e8%bf%90%e7%ae%97%e7%ac%a6-" class="header-mark"></a>5 五、三路比较运算符 <code>&lt;=&gt;</code></h2><p>俗称「飞船运算符」，一次比较得出大小关系：</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><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</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="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="k">auto</span> <span class="k">operator</span><span class="o">&lt;=&gt;</span><span class="p">(</span><span class="k">const</span> <span class="n">Point</span><span class="o">&amp;</span><span class="p">)</span> <span class="k">const</span> <span class="o">=</span> <span class="k">default</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><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">Point</span> <span class="n">a</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="n">b</span><span class="p">{</span><span class="mi">3</span><span class="p">,</span> <span class="mi">4</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">a</span> <span class="o">&lt;</span> <span class="n">b</span><span class="p">;</span>   <span class="c1">// OK，自动生成
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">a</span> <span class="o">&gt;=</span> <span class="n">b</span><span class="p">;</span>  <span class="c1">// OK
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">;</span>  <span class="c1">// OK
</span></span></span></code></pre></td></tr></table>
</div>
</div><p>返回类型有三种：</p>
<ul>
<li><code>std::strong_ordering</code> — 强序（完全可比）</li>
<li><code>std::weak_ordering</code> — 弱序</li>
<li><code>std::partial_ordering</code> — 偏序（可能不可比，比如 NaN）</li>
</ul>
<hr>
<h2 id="六指定初始化designated-initializers" class="headerLink">
    <a href="#%e5%85%ad%e6%8c%87%e5%ae%9a%e5%88%9d%e5%a7%8b%e5%8c%96designated-initializers" class="header-mark"></a>6 六、指定初始化（Designated Initializers）</h2><p>像 C 语言那样按名字初始化结构体成员：</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><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></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="k">struct</span> <span class="nc">Point</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">x</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">    <span class="kt">int</span> <span class="n">z</span> <span class="o">=</span> <span class="mi">0</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="n">Point</span> <span class="n">p</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">x</span> <span class="o">=</span> <span class="mi">10</span><span class="p">,</span>
</span></span><span class="line"><span class="cl">    <span class="p">.</span><span class="n">z</span> <span class="o">=</span> <span class="mi">30</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// y 用默认值 0
</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><p>注意：顺序必须和声明顺序一致，不能跳着来。</p>
<hr>
<h2 id="七consteval-与-constinit" class="headerLink">
    <a href="#%e4%b8%83consteval-%e4%b8%8e-constinit" class="header-mark"></a>7 七、<code>consteval</code> 与 <code>constinit</code></h2><h3 id="71-consteval--立即函数" class="headerLink">
    <a href="#71-consteval--%e7%ab%8b%e5%8d%b3%e5%87%bd%e6%95%b0" class="header-mark"></a>7.1 7.1 consteval — 立即函数</h3><p>必须在编译期执行，否则报错：</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><span class="lnt">6
</span><span class="lnt">7
</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="k">consteval</span> <span class="kt">int</span> <span class="nf">sqr</span><span class="p">(</span><span class="kt">int</span> <span class="n">n</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">return</span> <span class="n">n</span> <span class="o">*</span> <span class="n">n</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="k">constexpr</span> <span class="kt">int</span> <span class="n">a</span> <span class="o">=</span> <span class="n">sqr</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>  <span class="c1">// OK，编译期
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="n">sqr</span><span class="p">(</span><span class="mi">20</span><span class="p">);</span>            <span class="c1">// OK，编译期常量
</span></span></span><span class="line"><span class="cl"><span class="c1">// int x = 5; sqr(x);       // ERROR，x 不是编译期常量
</span></span></span></code></pre></td></tr></table>
</div>
</div><h3 id="72-constinit--常量初始化" class="headerLink">
    <a href="#72-constinit--%e5%b8%b8%e9%87%8f%e5%88%9d%e5%a7%8b%e5%8c%96" class="header-mark"></a>7.2 7.2 constinit — 常量初始化</h3><p>保证变量在编译期初始化，避免静态初始化顺序问题：</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></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">constinit</span> <span class="kt">int</span> <span class="n">global</span> <span class="o">=</span> <span class="n">compute_at_compile_time</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="八stdformat" class="headerLink">
    <a href="#%e5%85%abstdformat" class="header-mark"></a>8 八、<code>std::format</code></h2><p>Python 风格的格式化字符串，终于不用 <code>printf</code> 或 <code>stringstream</code> 了：</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><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></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="cp">#include</span> <span class="cpf">&lt;format&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">s</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;Hello, {}! You are {} years old.&#34;</span><span class="p">,</span> <span class="s">&#34;Tom&#34;</span><span class="p">,</span> <span class="mi">25</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="c1">// &#34;Hello, Tom! You are 25 years old.&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// 按位置
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{1} {0}&#34;</span><span class="p">,</span> <span class="s">&#34;world&#34;</span><span class="p">,</span> <span class="s">&#34;Hello&#34;</span><span class="p">);</span>  <span class="c1">// &#34;Hello world&#34;
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="c1">// 格式说明
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:&gt;10}&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>    <span class="c1">// 右对齐，占10位
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:08b}&#34;</span><span class="p">,</span> <span class="mi">42</span><span class="p">);</span>    <span class="c1">// 8位二进制，前导零
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">std</span><span class="o">::</span><span class="n">format</span><span class="p">(</span><span class="s">&#34;{:.2f}&#34;</span><span class="p">,</span> <span class="mf">3.14159</span><span class="p">);</span>  <span class="c1">// 保留2位小数
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="九stdspan" class="headerLink">
    <a href="#%e4%b9%9dstdspan" class="header-mark"></a>9 九、<code>std::span</code></h2><p>连续内存的视图，类似 <code>string_view</code> 但是通用的：</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><span class="lnt">6
</span><span class="lnt">7
</span><span class="lnt">8
</span><span class="lnt">9
</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="kt">void</span> <span class="nf">printArray</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">span</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">arr</span><span class="p">)</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="nl">x</span> <span class="p">:</span> <span class="n">arr</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="n">x</span> <span class="o">&lt;&lt;</span> <span class="s">&#34; &#34;</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="kt">int</span> <span class="n">a</span><span class="p">[]</span> <span class="o">=</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></span><span class="line"><span class="cl"><span class="n">printArray</span><span class="p">(</span><span class="n">a</span><span class="p">);</span>              <span class="c1">// 原生数组
</span></span></span><span class="line"><span class="cl"><span class="c1"></span>
</span></span><span class="line"><span class="cl"><span class="n">std</span><span class="o">::</span><span class="n">vector</span> <span class="n">v</span> <span class="o">=</span> <span class="p">{</span><span class="mi">4</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">};</span>
</span></span><span class="line"><span class="cl"><span class="n">printArray</span><span class="p">(</span><span class="n">v</span><span class="p">);</span>              <span class="c1">// vector
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="十其他特性速览" class="headerLink">
    <a href="#%e5%8d%81%e5%85%b6%e4%bb%96%e7%89%b9%e6%80%a7%e9%80%9f%e8%a7%88" class="header-mark"></a>10 十、其他特性速览</h2><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>说明</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td><code>std::jthread</code></td>
          <td>自动 join 的线程，支持停止令牌</td>
      </tr>
      <tr>
          <td><code>std::stop_token</code></td>
          <td>协作式线程中断</td>
      </tr>
      <tr>
          <td><code>std::source_location</code></td>
          <td>获取当前代码位置（文件名、行号）</td>
      </tr>
      <tr>
          <td><code>std::bit_cast</code></td>
          <td>安全的类型双关，替代 memcpy</td>
      </tr>
      <tr>
          <td><code>std::midpoint</code> / <code>std::lerp</code></td>
          <td>中点和线性插值</td>
      </tr>
      <tr>
          <td><code>[[likely]]</code> / <code>[[unlikely]]</code></td>
          <td>给编译器分支预测提示</td>
      </tr>
      <tr>
          <td>范围 for 初始化语句</td>
          <td><code>for (auto it = v.begin(); auto x : v)</code></td>
      </tr>
  </tbody>
</table>
<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">// likely/unlikely 示例
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="k">if</span> <span class="p">(</span><span class="n">likely</span><span class="p">(</span><span class="n">n</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">))</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <span class="c1">// 大概率走这里，编译器优化
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
</span></span><span class="line"><span class="cl">    <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="#%e6%80%bb%e7%bb%93" class="header-mark"></a>11 总结</h2><p>C++20 是<strong>改变编程范式的大版本</strong>：</p>
<ul>
<li><strong>Concepts</strong>：模板终于好用了，报错终于能看懂了</li>
<li><strong>Ranges</strong>：STL 算法的现代写法，链式调用爽</li>
<li><strong>Coroutines</strong>：异步编程基础设施</li>
<li><strong>Modules</strong>：告别头文件，编译起飞</li>
<li><strong>format / span / jthread</strong>：各种小确幸</li>
</ul>
]]></description></item><item><title>STL 常用容器速查表</title><link>https://soybeanmilk.netlify.app/stl%E5%AE%B9%E5%99%A8%E9%80%9F%E6%9F%A5%E8%A1%A8/</link><pubDate>Fri, 17 Jul 2026 00:00:00 +0000</pubDate><author><name>作者</name></author><guid>https://soybeanmilk.netlify.app/stl%E5%AE%B9%E5%99%A8%E9%80%9F%E6%9F%A5%E8%A1%A8/</guid><description><![CDATA[<h2 id="一序列容器" class="headerLink">
    <a href="#%e4%b8%80%e5%ba%8f%e5%88%97%e5%ae%b9%e5%99%a8" class="header-mark"></a>1 一、序列容器</h2><h3 id="vector--动态数组-" class="headerLink">
    <a href="#vector--%e5%8a%a8%e6%80%81%e6%95%b0%e7%bb%84-" class="header-mark"></a>1.1 vector — 动态数组 ⭐</h3><table>
  <thead>
      <tr>
          <th>操作</th>
          <th>用法</th>
          <th>时间</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>尾插</td>
          <td><code>v.push_back(x)</code></td>
          <td>O(1) 均摊</td>
      </tr>
      <tr>
          <td>尾删</td>
          <td><code>v.pop_back()</code></td>
          <td>O(1)</td>
      </tr>
      <tr>
          <td>插入</td>
          <td><code>v.insert(it, x)</code></td>
          <td>O(n)</td>
      </tr>
      <tr>
          <td>删除</td>
          <td><code>v.erase(it)</code></td>
          <td>O(n)</td>
      </tr>
      <tr>
          <td>访问</td>
          <td><code>v[i]</code> / <code>v.at(i)</code></td>
          <td>O(1)</td>
      </tr>
      <tr>
          <td>大小</td>
          <td><code>v.size()</code> / <code>v.capacity()</code></td>
          <td>O(1)</td>
      </tr>
      <tr>
          <td>清空</td>
          <td><code>v.clear()</code></td>
          <td>O(n)</td>
      </tr>
      <tr>
          <td>预留</td>
          <td><code>v.reserve(n)</code></td>
          <td>O(n)</td>
      </tr>
  </tbody>
</table>
<p><strong>特点：</strong> 连续内存，随机访问快，中间插入慢，尾插最快</p>
<hr>
<h3 id="deque--双端队列" class="headerLink">
    <a href="#deque--%e5%8f%8c%e7%ab%af%e9%98%9f%e5%88%97" class="header-mark"></a>1.2 deque — 双端队列</h3><table>
  <thead>
      <tr>
          <th>操作</th>
          <th>用法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>头插</td>
          <td><code>dq.push_front(x)</code></td>
      </tr>
      <tr>
          <td>头删</td>
          <td><code>dq.pop_front()</code></td>
      </tr>
      <tr>
          <td>尾插</td>
          <td><code>dq.push_back(x)</code></td>
      </tr>
      <tr>
          <td>尾删</td>
          <td><code>dq.pop_back()</code></td>
      </tr>
      <tr>
          <td>访问</td>
          <td><code>dq[i]</code></td>
      </tr>
  </tbody>
</table>
<p><strong>特点：</strong> 头尾都能 O(1) 插入删除，随机访问比 vector 慢一点</p>
<hr>
<h3 id="list--双向链表" class="headerLink">
    <a href="#list--%e5%8f%8c%e5%90%91%e9%93%be%e8%a1%a8" class="header-mark"></a>1.3 list — 双向链表</h3><table>
  <thead>
      <tr>
          <th>操作</th>
          <th>用法</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>插入</td>
          <td><code>lst.insert(it, x)</code></td>
      </tr>
      <tr>
          <td>删除</td>
          <td><code>lst.erase(it)</code></td>
      </tr>
      <tr>
          <td>头插</td>
          <td><code>lst.push_front(x)</code></td>
      </tr>
      <tr>
          <td>尾插</td>
          <td><code>lst.push_back(x)</code></td>
      </tr>
      <tr>
          <td>排序</td>
          <td><code>lst.sort()</code></td>
      </tr>
      <tr>
          <td>反转</td>
          <td><code>lst.reverse()</code></td>
      </tr>
  </tbody>
</table>
<p><strong>特点：</strong> 任意位置 O(1) 插入删除，但不能随机访问，用得少</p>
<hr>
<h2 id="二关联容器" class="headerLink">
    <a href="#%e4%ba%8c%e5%85%b3%e8%81%94%e5%ae%b9%e5%99%a8" class="header-mark"></a>2 二、关联容器</h2><h3 id="map--unordered_map--字典-" class="headerLink">
    <a href="#map--unordered_map--%e5%ad%97%e5%85%b8-" class="header-mark"></a>2.1 map / unordered_map — 字典 ⭐</h3><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>map</th>
          <th>unordered_map</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>底层</td>
          <td>红黑树</td>
          <td>哈希表</td>
      </tr>
      <tr>
          <td>有序</td>
          <td>✅ 按 key 排序</td>
          <td>❌ 无序</td>
      </tr>
      <tr>
          <td>插入</td>
          <td>O(log n)</td>
          <td>O(1) 均摊</td>
      </tr>
      <tr>
          <td>查询</td>
          <td>O(log n)</td>
          <td>O(1) 均摊</td>
      </tr>
      <tr>
          <td>遍历</td>
          <td>有序输出</td>
          <td>无序</td>
      </tr>
  </tbody>
</table>
<p><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><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">mp</span><span class="p">[</span><span class="n">key</span><span class="p">]</span> <span class="o">=</span> <span class="n">val</span><span class="p">;</span>       <span class="c1">// 插入/修改
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">mp</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>       <span class="c1">// 是否存在
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">mp</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">key</span><span class="p">);</span>        <span class="c1">// 返回迭代器
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">mp</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">key</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="k">auto</span><span class="o">&amp;</span> <span class="p">[</span><span class="n">k</span><span class="p">,</span> <span class="n">v</span><span class="p">]</span> <span class="o">:</span> <span class="n">mp</span><span class="p">)</span> <span class="p">{</span> <span class="p">}</span>  <span class="c1">// C++17 结构化绑定
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="set--unordered_set--集合" class="headerLink">
    <a href="#set--unordered_set--%e9%9b%86%e5%90%88" class="header-mark"></a>2.2 set / unordered_set — 集合</h3><table>
  <thead>
      <tr>
          <th>特性</th>
          <th>set</th>
          <th>unordered_set</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>底层</td>
          <td>红黑树</td>
          <td>哈希表</td>
      </tr>
      <tr>
          <td>有序</td>
          <td>✅</td>
          <td>❌</td>
      </tr>
      <tr>
          <td>去重</td>
          <td>✅</td>
          <td>✅</td>
      </tr>
  </tbody>
</table>
<p><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-cpp" data-lang="cpp"><span class="line"><span class="cl"><span class="n">st</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">st</span><span class="p">.</span><span class="n">erase</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="n">st</span><span class="p">.</span><span class="n">count</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>    <span class="c1">// 0 或 1
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">st</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="multiset--multimap" class="headerLink">
    <a href="#multiset--multimap" class="header-mark"></a>2.3 multiset / multimap</h3><p>允许重复 key 的版本，用法基本一样。</p>
<p><strong>multiset 注意：</strong> <code>erase(val)</code> 会删掉所有等于 val 的元素，删单个要用 <code>erase(iterator)</code></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></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="k">auto</span> <span class="n">it</span> <span class="o">=</span> <span class="n">ms</span><span class="p">.</span><span class="n">find</span><span class="p">(</span><span class="n">val</span><span class="p">);</span>
</span></span><span class="line"><span class="cl"><span class="k">if</span> <span class="p">(</span><span class="n">it</span> <span class="o">!=</span> <span class="n">ms</span><span class="p">.</span><span class="n">end</span><span class="p">())</span> <span class="n">ms</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">// 只删一个
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="三容器适配器" class="headerLink">
    <a href="#%e4%b8%89%e5%ae%b9%e5%99%a8%e9%80%82%e9%85%8d%e5%99%a8" class="header-mark"></a>3 三、容器适配器</h2><h3 id="stack--栈后进先出" class="headerLink">
    <a href="#stack--%e6%a0%88%e5%90%8e%e8%bf%9b%e5%85%88%e5%87%ba" class="header-mark"></a>3.1 stack — 栈（后进先出）</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">stack</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">st</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">st</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>    <span class="c1">// 压栈
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">st</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>      <span class="c1">// 弹栈（无返回值）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">st</span><span class="p">.</span><span class="n">top</span><span class="p">();</span>      <span class="c1">// 栈顶
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">st</span><span class="p">.</span><span class="n">empty</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">st</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>底层默认是 deque。</p>
<hr>
<h3 id="queue--队列先进先出" class="headerLink">
    <a href="#queue--%e9%98%9f%e5%88%97%e5%85%88%e8%bf%9b%e5%85%88%e5%87%ba" class="header-mark"></a>3.2 queue — 队列（先进先出）</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></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">queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">q</span><span class="p">;</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>     <span class="c1">// 入队
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">q</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>       <span class="c1">// 出队（无返回值）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">q</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">q</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">q</span><span class="p">.</span><span class="n">empty</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">q</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h3 id="priority_queue--优先队列堆" class="headerLink">
    <a href="#priority_queue--%e4%bc%98%e5%85%88%e9%98%9f%e5%88%97%e5%a0%86" class="header-mark"></a>3.3 priority_queue — 优先队列（堆）⭐</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></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">// 默认大顶堆
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">priority_queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;</span> <span class="n">pq</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="c1">// 小顶堆
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">priority_queue</span><span class="o">&lt;</span><span class="kt">int</span><span class="p">,</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">greater</span><span class="o">&lt;</span><span class="kt">int</span><span class="o">&gt;&gt;</span> <span class="n">minHeap</span><span class="p">;</span>
</span></span><span class="line"><span class="cl">
</span></span><span class="line"><span class="cl"><span class="n">pq</span><span class="p">.</span><span class="n">push</span><span class="p">(</span><span class="n">x</span><span class="p">);</span>    <span class="c1">// 插入
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">pq</span><span class="p">.</span><span class="n">pop</span><span class="p">();</span>      <span class="c1">// 弹出堆顶
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">pq</span><span class="p">.</span><span class="n">top</span><span class="p">();</span>      <span class="c1">// 堆顶元素
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">pq</span><span class="p">.</span><span class="n">empty</span><span class="p">();</span>
</span></span><span class="line"><span class="cl"><span class="n">pq</span><span class="p">.</span><span class="n">size</span><span class="p">();</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>默认是大顶堆</strong>，用 less&lt;int&gt; 比较。</p>
<hr>
<h2 id="四容器选择指南" class="headerLink">
    <a href="#%e5%9b%9b%e5%ae%b9%e5%99%a8%e9%80%89%e6%8b%a9%e6%8c%87%e5%8d%97" class="header-mark"></a>4 四、容器选择指南</h2><table>
  <thead>
      <tr>
          <th>需求</th>
          <th>推荐容器</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>随机访问多，尾插尾删</td>
          <td>vector</td>
      </tr>
      <tr>
          <td>头尾都要插入删除</td>
          <td>deque</td>
      </tr>
      <tr>
          <td>频繁中间插入删除</td>
          <td>list（很少用）</td>
      </tr>
      <tr>
          <td>key-value 查找，需要有序</td>
          <td>map</td>
      </tr>
      <tr>
          <td>key-value 查找，追求速度</td>
          <td>unordered_map</td>
      </tr>
      <tr>
          <td>去重 + 有序</td>
          <td>set</td>
      </tr>
      <tr>
          <td>去重 + 速度</td>
          <td>unordered_set</td>
      </tr>
      <tr>
          <td>栈操作</td>
          <td>stack</td>
      </tr>
      <tr>
          <td>队列操作</td>
          <td>queue</td>
      </tr>
      <tr>
          <td>求最大/最小值</td>
          <td>priority_queue</td>
      </tr>
  </tbody>
</table>
<hr>
<h2 id="五常用算法" class="headerLink">
    <a href="#%e4%ba%94%e5%b8%b8%e7%94%a8%e7%ae%97%e6%b3%95" class="header-mark"></a>5 五、常用算法</h2><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="cp">#include</span> <span class="cpf">&lt;algorithm&gt;</span><span class="cp">
</span></span></span><span class="line"><span class="cl"><span class="cp"></span>
</span></span><span class="line"><span class="cl"><span class="n">sort</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>           <span class="c1">// 排序
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">sort</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">rbegin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">rend</span><span class="p">());</span>         <span class="c1">// 降序
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">reverse</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>        <span class="c1">// 反转
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">swap</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">);</span>                         <span class="c1">// 交换
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">*</span><span class="n">max_element</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>   <span class="c1">// 最大值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="o">*</span><span class="n">min_element</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span>   <span class="c1">// 最小值
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">accumulate</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="mi">0</span><span class="p">);</span>  <span class="c1">// 求和（需 include &lt;numeric&gt;）
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">lower_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">x</span><span class="p">);</span> <span class="c1">// 第一个 &gt;= x
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">upper_bound</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">x</span><span class="p">);</span> <span class="c1">// 第一个 &gt; x
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">next_permutation</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">());</span> <span class="c1">// 下一个排列
</span></span></span><span class="line"><span class="cl"><span class="c1"></span><span class="n">fill</span><span class="p">(</span><span class="n">v</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">v</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">val</span><span class="p">);</span>      <span class="c1">// 填充
</span></span></span></code></pre></td></tr></table>
</div>
</div><hr>
<h2 id="六迭代器失效速记" class="headerLink">
    <a href="#%e5%85%ad%e8%bf%ad%e4%bb%a3%e5%99%a8%e5%a4%b1%e6%95%88%e9%80%9f%e8%ae%b0" class="header-mark"></a>6 六、迭代器失效速记</h2><table>
  <thead>
      <tr>
          <th>容器</th>
          <th>插入</th>
          <th>删除</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>vector</td>
          <td>扩容全部失效；否则插入点之后失效</td>
          <td>删除点及之后失效</td>
      </tr>
      <tr>
          <td>deque</td>
          <td>头尾插入只失效所有迭代器，引用不失效；中间插入全部失效</td>
          <td>中间删除全部失效；头尾删除对应端失效</td>
      </tr>
      <tr>
          <td>list / map / set</td>
          <td>不失效</td>
          <td>只有被删的失效</td>
      </tr>
  </tbody>
</table>
]]></description></item></channel></rss>