Skip to content

Commit 318f24e

Browse files
committed
deploy: 976cc5f
1 parent 516f3b6 commit 318f24e

5 files changed

Lines changed: 120 additions & 8 deletions

File tree

cpp_tricks/index.html

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -280,7 +280,11 @@
280280
<ul class="nav flex-column">
281281
</ul>
282282
</li>
283-
<li class="nav-item" data-bs-level="2"><a href="#lambda_1" class="nav-link">Lambda 复用代码</a>
283+
<li class="nav-item" data-bs-level="2"><a href="#lambda_1" class="nav-link">立即调用的 Lambda 初始化变量</a>
284+
<ul class="nav flex-column">
285+
</ul>
286+
</li>
287+
<li class="nav-item" data-bs-level="2"><a href="#lambda_2" class="nav-link">Lambda 复用代码</a>
284288
<ul class="nav flex-column">
285289
</ul>
286290
</li>
@@ -496,7 +500,8 @@ <h1 id="c">应知应会 C++ 小技巧</h1>
496500
<li><a href="#_7">继承构造函数</a></li>
497501
<li><a href="#_8">提前返回</a></li>
498502
<li><a href="#lambda">立即调用的 Lambda</a></li>
499-
<li><a href="#lambda_1">Lambda 复用代码</a></li>
503+
<li><a href="#lambda_1">立即调用的 Lambda 初始化变量</a></li>
504+
<li><a href="#lambda_2">Lambda 复用代码</a></li>
500505
<li><a href="#if-else">打表法代替 if-else</a></li>
501506
<li><a href="#inline">类内静态成员 inline</a></li>
502507
<li><a href="#make_pair">别再 make_pair 啦!</a></li>
@@ -905,7 +910,60 @@ <h2 id="lambda">立即调用的 Lambda</h2>
905910
}
906911
</code></pre>
907912
<p>这样,return 最多只能打断到当前 Lambda 函数结束的位置,而不能打断整个大函数了。</p>
908-
<h2 id="lambda_1">Lambda 复用代码</h2>
913+
<h2 id="lambda_1">立即调用的 Lambda 初始化变量</h2>
914+
<p>有些变量的初始化,需要大量的准备工作。</p>
915+
<p>例如创建一个 2048 大小的随机数组,里面填满 0 到 7 的随机整数。</p>
916+
<pre><code class="language-cpp">std::vector&lt;int&gt; v(2048);
917+
std::mt19937 gen;
918+
std::uniform_int_distribution&lt;int&gt; dis(0, 7);
919+
std::generate(v.begin(), v.end(), [&amp;] {
920+
return dis(gen);
921+
});
922+
</code></pre>
923+
<p>然而为了产生随机数,我们需要定义大量的临时变量,和函数调用。</p>
924+
<p>如果有很多个这样初始化工序复杂的变量,每个用到的局部变量名字就会互相冲突,导致无法编译。</p>
925+
<p>例如我们还想要随机一个 <code>float</code> 类型的数组 <code>v2</code>,其随机值是 0 到 1 的浮点数。</p>
926+
<p>为了不报错,必须把 <code>v2</code> 使用的所有中间变量都从 <code>dis</code> 改名为 <code>dis2</code>,非常麻烦。</p>
927+
<p>最重要的是很不直观,你永远不知道某个变量是属于哪个变量的初始化,全部平摊在一个作用域里,影响可读性。</p>
928+
<pre><code class="language-cpp">std::vector&lt;int&gt; v1(2048);
929+
std::mt19937 gen1;
930+
std::uniform_int_distribution&lt;int&gt; dis1(0, 7);
931+
std::generate(v1.begin(), v1.end(), [&amp;] {
932+
return dis1(gen1);
933+
});
934+
935+
std::vector&lt;float&gt; v2(2048);
936+
std::mt19937 gen2;
937+
std::uniform_real_distribution&lt;float&gt; dis2(0, 1);
938+
std::generate(v2.begin(), v2.end(), [&amp;] {
939+
return dis2(gen2);
940+
});
941+
</code></pre>
942+
<p>这时,可以用 Lambda 创建一个作用域,然后用返回的形式初始化变量。</p>
943+
<pre><code class="language-cpp">std::vector&lt;int&gt; v = [] {
944+
std::vector&lt;int&gt; v(2048);
945+
std::mt19937 gen;
946+
std::uniform_int_distribution&lt;int&gt; dis(0, 7);
947+
std::generate(v.begin(), v.end(), [&amp;] {
948+
return dis(gen);
949+
});
950+
return v;
951+
}();
952+
953+
std::vector&lt;float&gt; v = [] {
954+
std::vector&lt;float&gt; v(2048);
955+
std::mt19937 gen;
956+
std::uniform_int_distribution&lt;float&gt; dis(0, 1);
957+
std::generate(v.begin(), v.end(), [&amp;] {
958+
return dis(gen);
959+
});
960+
return v;
961+
}();
962+
</code></pre>
963+
<p>每个 Lambda 内都有自己独立的变量作用域,不会互相干扰。</p>
964+
<p>所有只在初始化 <code>v1</code> <code>v2</code> 用到的临时变量,即使名字重复也不会打架。</p>
965+
<p>而且能通过 Lambda 的范围和缩进,明确分辨谁属于谁。</p>
966+
<h2 id="lambda_2">Lambda 复用代码</h2>
909967
<pre><code class="language-cpp">void calc_average() {
910968
int res = 0;
911969
int count = 0;

index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -292,7 +292,7 @@ <h2 id="_1">前言</h2>
292292
<blockquote>
293293
<p><img src="./img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
294294
</blockquote>
295-
<p>更新时间:2025年01月02日 15:39:09 (UTC+08:00)</p>
295+
<p>更新时间:2025年01月05日 10:51:26 (UTC+08:00)</p>
296296
<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
297297
<h2 id="_2">格式约定</h2>
298298
<blockquote>

print_page/index.html

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -421,7 +421,7 @@ <h2 id="index-_1">前言</h2>
421421
<blockquote>
422422
<p><img src="../img/bulb.png" height="30px" width="auto" style="margin: 0; border: none"/> 本书还在持续更新中……要追番的话,可以在 <a href="https://github.com/parallel101/cppguidebook">GitHub</a> 点一下右上角的 “Watch” 按钮,每当小彭老师提交新 commit,GitHub 会向你发送一封电子邮件,提醒你小彭老师更新了。</p>
423423
</blockquote>
424-
<p>更新时间:2025年01月02日 15:39:09 (UTC+08:00)</p>
424+
<p>更新时间:2025年01月05日 10:51:26 (UTC+08:00)</p>
425425
<p><a href="https://parallel101.github.io/cppguidebook">在 GitHub Pages 浏览本书</a> | <a href="https://142857.red/book">在小彭老师自己维护的镜像上浏览本书</a></p>
426426
<h2 id="index-_2">格式约定</h2>
427427
<blockquote>
@@ -1504,7 +1504,8 @@ <h2 id="symbols-linkage">符号的链接类型 (linkage)</h2>
15041504
<li><a href="#cpp_tricks-_7">继承构造函数</a></li>
15051505
<li><a href="#cpp_tricks-_8">提前返回</a></li>
15061506
<li><a href="#cpp_tricks-lambda">立即调用的 Lambda</a></li>
1507-
<li><a href="#cpp_tricks-lambda_1">Lambda 复用代码</a></li>
1507+
<li><a href="#cpp_tricks-lambda_1">立即调用的 Lambda 初始化变量</a></li>
1508+
<li><a href="#cpp_tricks-lambda_2">Lambda 复用代码</a></li>
15081509
<li><a href="#cpp_tricks-if-else">打表法代替 if-else</a></li>
15091510
<li><a href="#cpp_tricks-inline">类内静态成员 inline</a></li>
15101511
<li><a href="#cpp_tricks-make_pair">别再 make_pair 啦!</a></li>
@@ -1913,7 +1914,60 @@ <h2 id="cpp_tricks-lambda">立即调用的 Lambda</h2>
19131914
}
19141915
</code></pre>
19151916
<p>这样,return 最多只能打断到当前 Lambda 函数结束的位置,而不能打断整个大函数了。</p>
1916-
<h2 id="cpp_tricks-lambda_1">Lambda 复用代码</h2>
1917+
<h2 id="cpp_tricks-lambda_1">立即调用的 Lambda 初始化变量</h2>
1918+
<p>有些变量的初始化,需要大量的准备工作。</p>
1919+
<p>例如创建一个 2048 大小的随机数组,里面填满 0 到 7 的随机整数。</p>
1920+
<pre><code class="language-cpp">std::vector&lt;int&gt; v(2048);
1921+
std::mt19937 gen;
1922+
std::uniform_int_distribution&lt;int&gt; dis(0, 7);
1923+
std::generate(v.begin(), v.end(), [&amp;] {
1924+
return dis(gen);
1925+
});
1926+
</code></pre>
1927+
<p>然而为了产生随机数,我们需要定义大量的临时变量,和函数调用。</p>
1928+
<p>如果有很多个这样初始化工序复杂的变量,每个用到的局部变量名字就会互相冲突,导致无法编译。</p>
1929+
<p>例如我们还想要随机一个 <code>float</code> 类型的数组 <code>v2</code>,其随机值是 0 到 1 的浮点数。</p>
1930+
<p>为了不报错,必须把 <code>v2</code> 使用的所有中间变量都从 <code>dis</code> 改名为 <code>dis2</code>,非常麻烦。</p>
1931+
<p>最重要的是很不直观,你永远不知道某个变量是属于哪个变量的初始化,全部平摊在一个作用域里,影响可读性。</p>
1932+
<pre><code class="language-cpp">std::vector&lt;int&gt; v1(2048);
1933+
std::mt19937 gen1;
1934+
std::uniform_int_distribution&lt;int&gt; dis1(0, 7);
1935+
std::generate(v1.begin(), v1.end(), [&amp;] {
1936+
return dis1(gen1);
1937+
});
1938+
1939+
std::vector&lt;float&gt; v2(2048);
1940+
std::mt19937 gen2;
1941+
std::uniform_real_distribution&lt;float&gt; dis2(0, 1);
1942+
std::generate(v2.begin(), v2.end(), [&amp;] {
1943+
return dis2(gen2);
1944+
});
1945+
</code></pre>
1946+
<p>这时,可以用 Lambda 创建一个作用域,然后用返回的形式初始化变量。</p>
1947+
<pre><code class="language-cpp">std::vector&lt;int&gt; v = [] {
1948+
std::vector&lt;int&gt; v(2048);
1949+
std::mt19937 gen;
1950+
std::uniform_int_distribution&lt;int&gt; dis(0, 7);
1951+
std::generate(v.begin(), v.end(), [&amp;] {
1952+
return dis(gen);
1953+
});
1954+
return v;
1955+
}();
1956+
1957+
std::vector&lt;float&gt; v = [] {
1958+
std::vector&lt;float&gt; v(2048);
1959+
std::mt19937 gen;
1960+
std::uniform_int_distribution&lt;float&gt; dis(0, 1);
1961+
std::generate(v.begin(), v.end(), [&amp;] {
1962+
return dis(gen);
1963+
});
1964+
return v;
1965+
}();
1966+
</code></pre>
1967+
<p>每个 Lambda 内都有自己独立的变量作用域,不会互相干扰。</p>
1968+
<p>所有只在初始化 <code>v1</code> <code>v2</code> 用到的临时变量,即使名字重复也不会打架。</p>
1969+
<p>而且能通过 Lambda 的范围和缩进,明确分辨谁属于谁。</p>
1970+
<h2 id="cpp_tricks-lambda_2">Lambda 复用代码</h2>
19171971
<pre><code class="language-cpp">void calc_average() {
19181972
int res = 0;
19191973
int count = 0;

search/search_index.json

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

sitemap.xml.gz

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)