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

STL 學習系列之一:C++ STL 輕松導學 — 從歷史到實戰的完整入門指南

     編輯:關於C++

什麼是 STL?

STL (Standard Template Library) 標準模板庫是 C++ 標準程式庫核心部分,由 Alexander Stepanov、Meng Lee 等人開發,1998 年納入 ANSI/ISO C++ 標準。它提供:

  • 容器:vector, list, deque, set, map, stack, queue... 管理資料集合
  • 演算法:sort, find, for_each, copy, transform... 通用操作
  • 迭代器:泛型指標抽象,串聯容器與演算法
  • 函數物件:可調用物件,支援演算法客製化
  • 配接器:container/iterator/function adaptors,介面轉換
  • 記憶體配置器:allocator,封裝記憶體管理策略

STL 歷史演進

STL 與 C++、標準庫、OOP、GP 關係圖譜

  • C++:語言基礎,template 機制使 STL 成為可能
  • 標準庫:STL 佔 ~80%,其餘為 iostream, string, locale, exception 等
  • OOP (面向物件):強調資料封裝、繼承、多型;演算法綁定於類別
  • GP (泛型程式設計):強調演算法與資料結構分離,透過概念與模型抽象;C++ 同時支援 OOP+GP

主流 STL 實作版本

時期關鍵事件
1970s 末Stepanov 於蘇聯開始思考算法抽象與泛型化
1980s嘗試 Schema、Ada 語言實作泛型庫;發現 OOP 繼承機制不足以支援泛型
1987貝爾實驗室首次用 C++ (無 template) 研究,受限於繼承體系
1988進入 HP Palo Alto 實驗室
1992主持算法研究專案,與 Meng Lee 合作完成首版 HP STL
1993Andrew Koenig 推薦提交 ANSI/ISO C++ 標準委員會
1994聖迭戈會議提交提案,經 Stroustrup 等大師改進加入 allocator
1994 夏滑鐵盧會議 80% 支持,正式納入標準化進程
1998ANSI/ISO C++98 標準正式發布,STL 成標準庫核心

三版本範例演進:從原始陣列到 STL 極致優雅

版本一:C 風格 + qsort (痛點:固定大小、比較函數醜陋、手動記憶體)


#include 
#include 
int compare(const void* a, const void* b) {
    return (*(int*)a < *(int*)b) ? -1 : (*(int*)a > *(int*)b);
}
void main() {
    const int MAX = 10;
    int num[MAX]; int n=0;
    for (; cin >> num[n]; n++); // 輸入超過 MAX 會崩潰
    qsort(num, n, sizeof(int), compare);
    for (int i=0; i

版本二:vector + sort (解決:動態大小、型別安全、簡潔)


#include 
#include 
#include 
using namespace std;
void main() {
    vector num;
    int x;
    while (cin >> x) num.push_back(x); // 自動擴容
    sort(num.begin(), num.end());      // 型別安全,無比較函數
    for (int i=0; i

版本三:STL 極致組合 (輸入/處理/輸出各一行,零迴圈)


#include 
#include 
#include 
#include 
using namespace std;

int main() {
    typedef vector IntVec;
    typedef istream_iterator InIter;
    typedef ostream_iterator OutIter;
    typedef back_insert_iterator BackInserter;

    IntVec num;
    copy(InIter(cin), InIter(), BackInserter(num)); // 輸入 → 容器
    sort(num.begin(), num.end());                   // 處理
    copy(num.begin(), num.end(), OutIter(cout, "\n")); // 容器 → 輸出
    return 0;
}

關鍵元件:

  • istream_iterator:將 cin 包裝為 Input Iterator
  • ostream_iterator:將 cout 包裝為 Output Iterator
  • back_insert_iterator:引導 copy 呼叫 push_back 而非覆寫
  • copy、sort:通用演算法,透過迭代器範圍操作

編譯器環境設定指南

Visual C++ 6.0

  • 專案類型:Win32 Console Application
  • 編譯選項:/GX /MT (啟用異常處理、多執行緒靜態連結)
  • 預編譯標頭:關閉 (或統一使用 stdafx.h)
  • 警告 C4786 (符號截斷):加 #pragma warning(disable:4786)

Borland C++ Builder 5/6

  • 專案類型:Console Wizard
  • 命令列編譯:bcc32 file.cpp
  • BCB6 內建 STLport 4.5,標頭路徑 Include\Stlport
  • 模板雙右尖括號需空格:vector 避免誤判為 >>

現代 C++ (C++11/14/17/20) STL 新面貌

  • 自動型別推導:auto it = v.begin(); for (auto& x : v)
  • Lambda 表達式:sort(v.begin(), v.end(), [](int a, int b){ return a>b; });
  • 移動語意:vector v2 = std::move(v1); 零拷貝轉移
  • emplace 系列:v.emplace_back(args...) 原地建構
  • 異質查找 (C++14):map.find("key") 直接用字串字面值
  • 結構化綁定 (C++17):for (auto& [k, v] : m)
  • 範圍演算法 (C++20):std::ranges::sort(v); std::views::filter

學習路徑建議

  1. 掌握 vector, list, map, set 四大基本容器特性與選擇
  2. 熟練 迭代器範圍 [first, last) 與 演算法 (sort, find, copy, transform, accumulate)
  3. 理解 函數物件/謂詞 與 Lambda 客製化演算法行為
  4. 實作 自訂容器/迭代器 滿足 STL 概念需求 (進階)
  5. 研讀 原始碼 (SGI STL / libc++ / MSVC STL) 深入理解實作細節

推薦經典書籍

  1. 《STL 教程與參考指南》 — Musser & Saini (入門首選)
  2. 《Effective STL》 — Scott Meyers (50 條具體建議)
  3. 《C++ 標準程式庫》 — Nicolai Josuttis (百科全書)
  4. 《STL 源碼剖析》 — 侯捷 (中文經典,深度剖析 SGI STL)
  5. 《C++ Primer》 — Lippman 等 (語言基礎與 STL 整合)

結語

STL 不只是工具庫,更是一種思維模式:將問題分解為「資料結構 (容器)」、「操作邏輯 (演算法)」、「存取介面 (迭代器)」三個正交維度,實現最大程度的復用與組合。從 Stepanov 的數學抽想到今日 C++20 Ranges 的極致表達,STL 持續演進,始終是 C++ 程式設計師最強大的武器。現在,啟動編譯器,開始你的 STL 之旅吧!

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
版本來源特點採用編譯器
HP STLStepanov & Lee @ HP始祖、開源、參考實作歷史參考
P.J. Plauger (Dinkumware)商業授權VC6/VC7 內建、queue 效能弱、非開源MSVC
Rouge Wave商業BCB5 內建、可讀性佳、標準相容性較低BCB5
STLport開源社群 (Boris Fomitchev)移植 SGI STL 至 VC/BCB、高效能、標準相容、免費BCB6+, 可手動替換 VC
SGI STLSilicon Graphics (Stepanov, Austern)開源、高可讀性、GCC 內建、Linux 效能極佳GCC/G++