【C++ 筆記】模板(Templates)(下) - part 32
【C++ 筆記】模板(Templates)(下) - part 32 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 模板特製化(Template Specialization) It is possible in C++ to get a special behavior for a particular data type. This is called template specialization. From GeeksForGeeks 在 C++ 中,可以為特定資料型態賦予特殊的行為,就稱為模板特製化。 簡單來說,就是可以為特定資料型態去做不一樣的事情,如下範例: 1234567891011121314151617181920#include <iostream>using namespace std;template <typename T> void p...
【C++ 筆記】模板(Templates)(上) - part 31
【C++ 筆記】模板(Templates)(上) - part 31 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 先搞懂泛型程式設計 泛型程式設計(Generic programming),是一種程式設計的風格或範式(paradigm)。 :::info 註:最大名鼎鼎的 OOP 也是一種程式設計的範式。 ::: 泛型允許程式設計師在強型別程式設計語言中編寫代碼時使用一些以後才指定的類型,在實例化時作為參數指明這些類型。各種程式語言和其編譯器、執行環境對泛型的支援均不同。Ada、Delphi、Eiffel、Java、C#、F#、Swift 和 Visual Basic .NET 稱之為泛型(generics);ML、Scala 和 Haskell 稱之為參數多型(parametric polymorphism);C++ 和 D稱之為模板。具有廣泛影響的1994年版的《Design Patt...
【C++ 筆記】命名空間(Namespace) - part 30
【C++ 筆記】命名空間(Namespace) - part 30 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 可喜可賀可喜可賀,恭喜本系列終於來到 part 30 啦! 簡介(Introduction) 我們最熟悉的命名空間不外乎就是: 1using namespace std; 為什麼要用這個?因為我們不想要打那麼多字,每次打一行程式碼都要加上 std:: 不是挺麻煩的嗎? 123std::coutstd::endlstd::vector <int> a; 但其實除了圖方便以外,命名空間也有其他功能。 假設班上有兩名同學,他們都叫陳柏鈞,為了要區分他們兩個,我們就必定要用到額外的訊息去區分,如一個比較有錢,一個普通,或是一個帥,一個醜等等。 在 C++ 中,假設有個函數叫做 func(),而在另一個 library 也叫做 func(),此時就會有命名衝突(Name conf...
【C++ 筆記】動態記憶體(new / delete) - part 29
【C++ 筆記】動態記憶體(new / delete) - part 29 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 動態記憶體(Dynamic Memory) 什麼是動態記憶體? 當我們宣告一個變數的時候,編譯器會依據這個變數所屬的資料型態,自動配置其記憶體空間。這些資源都是配置於記憶體的堆疊區(stack),生命週期僅止於函數執行期間,當函數執行完成後就會自動清除。 另外,一旦配置後,就不能被刪除或更改他的大小。所以這時候動態記憶體就出現了。 在 C++ 中,記憶體分為兩部分(from 菜鳥教程): 堆疊區(stack):在函數內部宣告的所有變數都將佔用堆積記憶體。 堆積區(heap):程式中未使用的記憶體,在程式執行時可用於動態配置記憶體。 動態記憶體配置是在程式執行時配置記憶體的過程,這可以讓開發者在程式執行期間預留一些記憶體,依據開發者的需求去用它,然後再把記憶體給釋放以用於...
【C++ 筆記】例外處理(Exception Handling) - part 28
【C++ 筆記】例外處理(Exception Handling) - part 28 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 例外是什麼? 例外(exception)又稱為異常,是指程式在執行過程當中發生的例外情況或錯誤事件。如將兩數相除的過程中,有一個數除於 0,這會是一個例外,因為可能會導致未定義的錯誤。 而處理例外的過程就稱為例外處理,對 XD。 基本例外處理 try-catch 語法: 12345678try { // 這可能會拋出一個例外 // Code that might throw an exception} catch (ExceptionType e) { // 例外處理的地方 // exception handling code} 當 try 區塊發生例外的時候,於 try 的區塊會停止,catc...
【C++ 筆記】型態轉換運算子(Casting Operator)
【C++ 筆記】型態轉換運算子(Casting Operator) 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 四大運算子 稍後要講的這些運算子都是所謂的顯式轉換,表示有明確的函式去強制轉換資料型態,反之則為隱式轉換,如 10 / 1.0 自動轉成 float。 C-style 的顯式轉換:(int)var。 在 C++ 用 casting operator 取代,也更為安全。 1. static_cast 編譯時才轉換,因此在執行過程中沒有任何的效能開銷。 語法: 1static_cast <new_type> (exp); exp:要轉換的資料。 new_type:所需的運算式型態。 The static_cast can be used to convert between related types, such as numeric types or pointers ...
【C++ 筆記】檔案處理 - part 27
【C++ 筆記】檔案處理 - part 27 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 至此之前,我們已經有學過 <iostream> 的標準輸入輸出流 cin, cout。 那本篇要學的就是 <fstream> 裡面的三種流,ofstream, ifstream, fstream。 基本檔案處理(File Handing) <fstream> 定義了三種資料型態: 表格參考:菜鳥教程 資料型態 敘述 ofstream (o:Output)輸出檔案流,用於建立檔案並向檔案寫入訊息。 ifstream (i:Input)輸入檔案流,用於從檔案中讀取訊息。 fstream 上述兩種資料型態的結合體,亦即同時具備兩種資料型態的功能。 要做到檔案處理,需引入 <iostream> 跟 <fstream>。 檔案...
【C++ 筆記】抽象類別(Abstract Class, ABC) - part 26
【C++ 筆記】抽象類別(Abstract Class, ABC) - part 26 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 純虛函數(Pure Virtual Function) 在講抽象類別(簡稱 ABC)之前,先來複習一下這個鬼東西。 :::info 純虛函數(Pure Virtual Functions): 一個包含純虛函數的類別被稱為抽象類別(Abstract Class),它不能被直接實例化。 純虛函數沒有函數體,宣告時使用 = 0。 它強制衍生類別提供具體的實作。 ::: 來源:菜鳥教程 純虛函數宣告例子: 1234class Shape {public: virtual void draw() = 0; // 純虛擬函式}; 以上這段是來自本篇筆記系列的 part 23 多型。 抽象類別(Abstract Class, ABC) 定義 抽象...
【C++ 筆記】資料抽象與 ADT - part 25
【C++ 筆記】資料抽象與 ADT - part 25 很感謝你點進來這篇文章。 你好,我並不是什麼 C++、程式語言的專家,所以本文若有些錯誤麻煩請各位鞭大力一點,我極需各位的指正及指導!!本系列文章的性質主要以詼諧的口吻,一派輕鬆的態度自學程式語言,如果你喜歡,麻煩留言說聲文章讚讚吧! 簡介 Data abstraction refers to providing only essential information about the data to the outside world, ignoring unnecessary details or implementation. From GeeksForGeeks 資料抽象指的是只提供外界所必要的資訊,忽略不必要的細節或實作面。 什麼意思呢?就像你在玩遊戲時,可以看到角色的 HP、MP 等資訊,但你不需要知道這些數值是怎麼計算的、存在哪個記憶體位址、或者用什麼資料結構去記錄這些資訊。 遊戲開發者只會讓你看到角色的重要狀態資訊,而把它的具體表示方法(如 class 的欄位、加密編碼或計算過程)藏起來,這就是資料抽象。...
【Leetcode C++ 解題筆記】Greedy - part 1
【Leetcode C++ 解題筆記】Greedy - part 1 本筆記僅供個人學習用途,內容斟酌參考。 409. Longest Palindrome difficulty : Easy. tags : hashtable, string, greedy. 題目敘述: 給定一個由大寫或小寫所組成的字串 s,回傳那些可以由字母所組成最長回文的長度。 字母是區分大小寫的,如 Aa 不被視為一種回文。 解題思路: 建立一個 hashtable (unordered_map),計算每個字母所出現的次數。 如果次數是偶數:表示可以對稱放在回文的左右兩邊,可以全部使用,所以直接將次數加進去 len 裡面。 若次數是奇數:因為回文有對稱性,所以只能用偶數部分(次數 - 1)放在左右兩邊,剩下的字母可置於回文中間。(整個回文只能有一個這樣的字母在中間) solution ( 0 ms ): 12345678910111213141516171819202122232425262728class Solution {public: int longestPalindrom...
【C++筆記】Iterator(迭代器)
【C++筆記】Iterator(迭代器) 該筆記僅供個人學習用途,部分用詞、解釋等若有誤方可指正,感謝您的觀看。 簡介 Iterator,名為迭代器,光看名字就是一個非常抽象的東西XD。 Iterator 是一種類指針(pointer-like)的物件,指向 STL container 的元素。像是 vec.begin() 跟 vec.end() 分別指向 vec 容器的第一個元素跟末尾元素的記憶體位址,使用 * 做 Dereference 的動作即可取值。 整理一下:Iterator 的意義是記憶體位址,使用 * Dereference operator 可用來取得目前 iterator 所指向的元素的值。 Why is Iterator? 而迭代器之所以被稱為迭代器,是因為它的設計目的是為了支援容器中元素的「逐一存取」(iteration),類似於指標。 首先要說什麼是迭代 iteration? 「迭代」的核心概念是:重複逐個存取資料結構中的每個元素,直到全部處理完畢。其實就是跑迴圈的意思,如下是一個最基本的迭代行為: 12345// use for loop to do i...
【C++】競程筆記(資料結構:Unordered set / map)
【C++】競程筆記(資料結構:Unordered set / map) 程式碼範例參考:NTUCPC Guide,此筆記僅為個人學習用途。 簡介 Unordered set / map 皆為無序的(unordered)關聯式容器,內部實作原理皆是 Hash(雜湊),對於每次操作的時間複雜度都是 $O(1)$ 。如果此資料結構發生碰撞的話,最壞的時間複雜度會到 $O(n)$ 。 那既然都無序了,所以就字面上意思,輸出的元素不一定會照著順序排。 Unordered set / map 提供了較快的操作速度,在操作上面也與原本的 set / map 無異,基本上都相通。 另外兩者的標頭檔都有稍微更改: 12#include <unordered_set>#include <unordered_map> 雜湊(Hash)介紹 雜湊函式(英語:Hash function)又稱雜湊演算法,是一種從任何一種資料中建立小的數字「指紋」的方法。雜湊函式把訊息或資料計算成摘要,使得資料量變小,將資料的格式固定下來。該函式將資料打亂混合,重新建立一個叫做雜湊值(又叫雜湊值)(...
【C++】競程筆記(資料結構:map)
【C++】競程筆記(資料結構:map) 程式碼範例參考:NTUCPC Guide,此筆記僅為個人學習用途。 簡介 map 是 C++ STL 裡面的一個容器,跟 set 一樣都是關聯式容器(Associative Container),他用鍵值對(Key & Value)的方式來存資料,並自動依 key 的順序進行排序(預設為升序)。 可以想成 Python 的 dictionary,但有點不一樣。 鍵值對就是 key 對應一個 value,如:{1, "apple"},1 這個 key 會對應到 apple,輸入 1 時就會輸出 apple。 map 的底層結構也是基於紅黑樹的自平衡二元搜尋樹。 特性 唯一性: key 不能重複。 元素型態: pair<const Key, T>,key 為常數。 不支援隨機存取: 只能透過 iterator 遍歷容器。 雙向迭代器: 可向前向後遍歷元素,表示可用 rbegin() 跟 rend() 反向迭代器。 語法(Syntax) 1map<key...
【C++】競程筆記(資料結構:set)
【C++】競程筆記(資料結構:set) 程式碼範例參考:NTUCPC Guide,此筆記僅為個人學習用途。 簡介 set 是基於紅黑樹(Red-black tree)所實現的,紅黑樹是一種自平衡避免退化的二元搜尋樹,而因為 STL 幫我們實作出來了,所以不用再重造輪子。 所以 set 在查詢、插入、刪除這方面都是對數時間 $O(logn)$ 。 另外 set 也是一種關聯式容器(Associative Container),就是使用 key 來做資料存取(set 以輸入的 value 作為 key,可查找 value 是否存在 set 中)。 關聯式容器也可再細分為有序(ordered)與無序(unordered)。 set 特性 唯一性: set 中的元素不能重複出現,若 insert 重複值,會自動被忽略。 有序性: set 中的元素會依照升序(預設)自動排序,可改成降序。 無法直接修改: 因為直接修改會破壞 set 的有序性,所以要改的話要先刪除再插入。 語法(Syntax) 1set<T, comp> s; T:在 set 中元素的資料型...
【C++】競程筆記(資料結構:Heap)
【C++】競程筆記(資料結構:Heap) 程式碼範例參考:NTUCPC Guide,此筆記僅為個人學習用途。 簡介 Heap(堆積),是一個完全二元樹的資料結構,主要應用於優先佇列(priority queue)中。 由於他是完全二元樹結構,所以: 除了最底層外,其他每一層都是滿的。 最底層節點從左到右依序填滿。 樹上的每一個節點儲存一個可以比較大小的鍵值(key),並支援以下操作: 插入一個鍵值 詢問目前最大的鍵值 刪除最大的鍵值 From NTUCPC Guide Heap 通常遵守下列其中一種堆積性質: 最小堆(Min-Heap):每個節點的值都 $\leq$ 其子節點的值。(根節點是整棵樹中最小的元素) 最大堆(Max-Heap):每個節點的值都 $\ge$ 其子節點的值。(根節點是整棵樹中最大的元素) Image Source:https://www.geeksforgeeks.org/dsa/heap-data-structure/ 以下網站有可以滑動的視窗,展示哪一種是 invalid heap,哪一種是 valid heap。 https://w...


