{ "cells": [ { "cell_type": "markdown", "id": "b7be4315-3ea5-4d75-8c0b-b69b5ec4fd2a", "metadata": {}, "source": [ "# C++ vs Python" ] }, { "cell_type": "markdown", "id": "afcd7ee3-5d11-487b-bdbd-c967fee53039", "metadata": {}, "source": [ "## C++ `switch` vs Python `match`\n", "\n", "* C++\n", " * 不一定逐行比對。當 `case` 是連續的整數,編譯器可能使用 jump table 執行時直接跳轉\n", " * 如果 `case` 較複雜,編譯器可能退回使用類似 `if-else` 的策略但仍會做最佳化\n", "* Python\n", " * 是逐行比對。因為 Python 是直譯式語言,`match-case` 就像結構化的 `if-elif`\n", "\n", "\n", "| 特性 | C++ switch | Python match |\n", "|------------------|--------------------------------------------------|-----------------------------------------------|\n", "| 執行方式 | 編譯後可轉為 jump table(快速跳轉) | 逐行比對模式(interpreted 解譯執行) |\n", "| 支援的資料型別 | 整數、enum(編譯時期常數) | 幾乎所有型別:數值、字串、類別、結構化資料等 |\n", "| 語法彈性 | 語法固定,僅支援簡單常數 case | 支援模式比對、結構解構、型別檢查、守衛條件等 |\n", "| 執行效能 | 效能高,視編譯器最佳化而定 | 效能較低,但可讀性與表達能力極高 |" ] }, { "cell_type": "markdown", "id": "0bab0e39-4e9d-4684-936f-f082c3c1fb0c", "metadata": {}, "source": [ "## C++ `unordered_map` vs Python `defaultdict`\n", "\n", "* C++ `unordered_map` 其實是比較像 Python 的 `defaultdict`,第一次用新的 key 呼叫 operator[] 時不會出現 key error 而是會有一個預設值。下面這個是可以跑的 `d['c']` 的值會變成 1\n", "\n", "```c++\n", "#include \n", "\n", "std::unordered_map d;\n", "\n", "d['c']++;\n", "\n", "```" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.12.3" } }, "nbformat": 4, "nbformat_minor": 5 }