首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

冒號課堂 §3.1:泛型編程——抽象你的算法

     編輯:Java 相關知識

痛點:靜態類型語言的類型牆

相同邏輯因參數類型不同無法合併,導致 maxInt、maxLong、maxFloat… 滋生冗餘。C 巨集雖能複用但無類型安全。

泛型編程核心思想

將算法與其操作的資料結構分離,並將後者最大程度泛化,基於參數多態實現算法最大重用。
  • 優於 OOP 的子型多態:更通用、零執行期開銷(編譯期展開)。
  • 代價:語法稍複雜、可讀性稍降。

STL 三大支柱

要素角色抽象對應
Algorithm(算法)一系列可行步驟脊椎
Container(容器)資料集合抽象陣列(肉)
Iterator(迭代器)算法與容器介面抽象指標/游標

「算法串聯資料,資料實化算法。」

泛化的維度

  1. 容器:vector、list、set、map、deque、string…
  2. 元素類型:任意型別。
  3. 處理邏輯:函數、函數物件、Lambda。
  4. 判斷條件:Predicate。
  5. 迭代器類別:前向、雙向、隨機存取、自定義遍歷規則。

泛型算法範例:統一處理框架

template <class Iterator, class Act, class Test>
void process(Iterator begin, Iterator end, Act act, Test test) {
    for (; begin != end; ++begin)
        if (test(*begin)) act(*begin);
}

六道看似無關題目(素數求和、完全平方數開根號、及格生名單、二元樹重新著色、字串反向拷貝、非數字字元過濾)共性:對指定範圍內滿足條件的元素執行動作。上述 process 一次解決。

標準輸入也可作容器

bool notDigit(char c) { return c < '0' || c > '9'; }
void printNonDigit(char c) { cout << c << "不是數字字符" << endl; }

int main() {
    process(istream_iterator<char>(cin), istream_iterator<char>(),
            printNonDigit, notDigit);
}

istream_iterator 將標準輸入包裝為容器,無顯式 I/O 迴圈,極致抽象。

泛型編程的數學本質

  • 算法導向:以算法為中心,逐步模糊化概念內涵、擴大外延,抽象化/一般化運算。
  • 類比數學家證明定理後放寬假設、增強結論,推廣定理(思想為雞,結論為蛋)。
  • STL 作者 Stepanov 為數學家出身,深受數學思維影響。

總結

  • 泛型編程打破類型牆,在確保類型安全、零效能損失前提下極大提升算法復用。
  • STL 三要素(算法、容器、迭代器)構成通用協作框架。
  • 不僅泛化型別,更泛化行為(函數/函數物件/運算子)。
  • 本質是算法導向的數學思維:抽象出核心算法,最大化適用域。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved