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

C++ STL 入門指南:從模板基礎到容器/演算法/迭代器核心三件套

     編輯:VC 教學

讀者對象

已學習 C++ 語法(含模板),但未接觸 STL 的初學者。本文為學習筆記風格,資深開發者可跳過。

什麼是泛型程式設計?

簡單說:**使用模板的程式設計**。正如「面向物件 = 使用虛函數」,泛型程式設計核心是**型別參數化**——演算法/資料結構與具體型別解耦。

STL 是什麼?

  • Standard Template Library:C++ 標準庫核心部分,ANSI/ISO 標準
  • **跨平台、跨編譯器、零安裝** (內建於編譯器標準庫)
  • 提供 **容器、演算法、迭代器** 三大支柱 + 配接器、函數物件、配置器
  • 介面統一,底層實現編譯器自行優化(如 GCC libstdc++、LLVM libc++、MSVC STL)

為什麼學 STL?

  1. **標準化**:所有現代 C++ 編譯器支援,程式碼可移植
  2. **現成輪子**:排序、搜尋、堆疊、佇列、關聯容器… 重造輪子是浪費
  3. **高效能**:專家調優,多數情況優於手寫
  4. **可讀性**:意圖導向代碼,sort(v.begin(), v.end()) 比手寫快排清晰
  5. **生態基礎**:Boost、Qt、現代 C++ 庫皆建構於 STL 之上

前置知識:模板與命名空間

函數模板

template
T Max(T a, T b) { return a > b ? a : b; }

類別模板

template
class Stack {
    std::vector data;
public:
    void push(const T& v) { data.push_back(v); }
    T pop() { T v = data.back(); data.pop_back(); return v; }
};

命名空間 std

STL 所有符號在 std::,建議**不使用 using namespace std;**,改用 using std::vector; 或完整限定,避免汙染全域命名空間。

STL 三大支柱速覽

1. 容器 —— 管理資料的倉庫

分類容器特性典型場景
序列容器vector動態陣列、連續記憶體、尾端 O(1) 增刪預設首選、隨機存取
deque雙端佇列、分段連續、雙端 O(1)雙端操作、大物件避免重新分配
list雙向鏈表、非連續、任意位置 O(1) 插刪頻繁中間插刪、穩定迭代器
forward_list單向鏈表、極省記憶體單向遍歷、極限記憶體敏感
關聯容器set/multiset紅黑樹、有序、唯一/可重複去重、區間查詢、有序集合
map/multimap鍵值對、按鍵有序字典、查找表、配置映射
unordered_set/map雜湊表、平均 O(1)、無序高速查找、不需有序
容器配接器stack/queue/priority_queue封裝底層容器、限制介面LIFO/FIFO/優先級佇列

2. 迭代器 —— 統一遍歷介面

std::vector v = {1,2,3,4,5};
for (auto it = v.begin(); it != v.end(); ++it)
    std::cout << *it << ' ';  // 1 2 3 4 5

// C++11 範圍 for (推薦)
for (int x : v) std::cout << x << ' ';
  • 五大類別:輸入、輸出、前向、雙向、隨機存取
  • 容器提供 begin()/end()、rbegin()/rend()、cbegin()/cend() (const)

3. 演算法 —— 可複用的操作邏輯


#include 
std::vector v = {5,3,1,4,2};
std::sort(v.begin(), v.end());        // 1 2 3 4 5
auto it = std::find(v.begin(), v.end(), 3);
std::copy(v.begin(), v.end(), std::ostream_iterator(std::cout, " "));
  • 非修改:find, count, equal, search
  • 修改:copy, transform, replace, fill, generate
  • 排序/分區:sort, stable_sort, partition, nth_element
  • 集合:set_union, set_intersection, set_difference
  • 堆:make_heap, push_heap, pop_heap, sort_heap

實戰範例:vector 進階操作


#include 
#include 
int main() {
    std::vector q = {10,11,12};
    std::vector v;
    for (int i=0;i<5;++i) v.push_back(i);  // 0 1 2 3 4

    auto it = v.begin() + 1;               // 指向 1
    it = v.insert(it, 33);                 // 0 33 1 2 3 4
    v.insert(it, q.begin(), q.end());      // 0 10 11 12 33 1 2 3 4
    it = v.begin() + 3;
    v.insert(it, 3, -1);                   // 插入 3 個 -1
    it = v.begin() + 4;
    v.erase(it);                           // 刪除單個
    it = v.begin() + 1;
    v.erase(it, it+4);                     // 刪除區間
    v.clear();                             // 清空
}

常見新手誤區

誤區正確認知
vector 擴容會失效所有迭代器/指標/參考預留 reserve() 減少擴容;需穩定地址用 list 或 deque
map[key] 會預設建構值唯讀查找用 find() 或 at() (C++11)
演算法需包含 大部分在 ,數值類在
刪除元素迭代器失效用 erase 返回的新迭代器繼續迴圈

總結

STL 是 C++ 開發者的**標準武庫**。掌握 容器選擇原則、迭代器分類、演算法分類 三大核心,配合 auto、範圍 for、lambda (C++11) 即可寫出簡潔、高效、可維護的現代 C++ 代碼。建議閱讀《STL 源碼剖析》(侯損) 深入底層實現。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved