| 版本 | 來源 | 特點 | 採用編譯器 |
| HP STL | Stepanov & Lee @ HP | 始祖、開源、參考實作 | 歷史參考 |
| P.J. Plauger (Dinkumware) | 商業授權 | VC6/VC7 內建、queue 效能弱、非開源 | MSVC |
| Rouge Wave | 商業 | BCB5 內建、可讀性佳、標準相容性較低 | BCB5 |
| STLport | 開源社群 (Boris Fomitchev) | 移植 SGI STL 至 VC/BCB、高效能、標準相容、免費 | BCB6+, 可手動替換 VC |
| SGI STL | Silicon Graphics (Stepanov, Austern) | 開源、高可讀性、GCC 內建、Linux 效能極佳 | GCC/G++ |
三版本範例演進:從原始陣列到 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
學習路徑建議
- 掌握 vector, list, map, set 四大基本容器特性與選擇
- 熟練 迭代器範圍 [first, last) 與 演算法 (sort, find, copy, transform, accumulate)
- 理解 函數物件/謂詞 與 Lambda 客製化演算法行為
- 實作 自訂容器/迭代器 滿足 STL 概念需求 (進階)
- 研讀 原始碼 (SGI STL / libc++ / MSVC STL) 深入理解實作細節
推薦經典書籍
- 《STL 教程與參考指南》 — Musser & Saini (入門首選)
- 《Effective STL》 — Scott Meyers (50 條具體建議)
- 《C++ 標準程式庫》 — Nicolai Josuttis (百科全書)
- 《STL 源碼剖析》 — 侯捷 (中文經典,深度剖析 SGI STL)
- 《C++ Primer》 — Lippman 等 (語言基礎與 STL 整合)
結語
STL 不只是工具庫,更是一種思維模式:將問題分解為「資料結構 (容器)」、「操作邏輯 (演算法)」、「存取介面 (迭代器)」三個正交維度,實現最大程度的復用與組合。從 Stepanov 的數學抽想到今日 C++20 Ranges 的極致表達,STL 持續演進,始終是 C++ 程式設計師最強大的武器。現在,啟動編譯器,開始你的 STL 之旅吧!
- 上一篇文章: STL 學習系列之二:標準模板庫深度導覽 — 以 list 為核心範例
- 下一篇文章: C++ Builder 透過 OLE 自動化操作 Excel 完整實戰指南
Copyright ©
程式碼之家 All Rights Reserved