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

C++ 標準模板庫 (STL) 核心架構詳解

     編輯:關於C++

C++ 標準模板庫 (STL) 核心架構詳解

一、基本概念

1.1 泛型程式設計

C++ 的核心優勢在於軟體重用,體現在兩大範式:

  • 面向對象:繼承、多態、標準類庫。
  • 泛型程式設計:模板機制、標準模板庫 (STL)。

泛型程式設計將常用數據結構(鏈表、數組、二叉樹等)與算法(排序、查找等)寫成模板,使用時無關具體數據類型,避免重複造輪子,且性能極高。

1.2 STL 三大核心組件

組件角色實現形式
容器通用數據結構,可存放任意類型類模板
迭代器統一存取介面,類似指針類模板
算法操作容器元素的函數模板函數模板

對象插入容器時存入的是副本;許多算法需比較元素,故放入容器的類型通常應重載 == 與 < 運算符。

二、容器詳解

2.1 順序容器

元素順序由插入位置決定,與值無關。

容器底層結構特點頭文件
vector動態數組連續內存,隨機存取 O(1),尾部增刪攤還 O(1)<vector>
deque雙端隊列(分段連續)隨機存取 O(1),兩端增刪攤還 O(1)<deque>
list雙向鏈表非連續內存,任意位置增刪 O(1),不支援隨機存取<list>

vector 結構示意 deque 結構示意 list 結構示意

2.2 關聯容器

元素自動按鍵值排序(通常用紅黑樹實現),查找/插入/刪除均為 O(log N)。

容器特點頭文件
set / multiset鍵值即元素;set 鍵值唯一,multiset 允許重複<set>
map / multimap元素為 pair<Key, Value>,按 Key 排序;map Key 唯一,multimap 允許重複 Key<map>

2.3 容器適配器

適配器行為底層預設容器頭文件
stack後進先出 (LIFO)deque<stack>
queue先進先出 (FIFO)deque<queue>
priority_queue最高優先級先出(最大堆)vector<queue>

stack 示意 queue 示意

2.4 通用成員函數

  • 迭代器:begin(), end(), rbegin(), rend()
  • 容量/修改:size(), empty(), clear(), erase()
  • 元素存取:front(), back(), push_back(), pop_back()

三、迭代器

3.1 基本用法

vector v = {1,2,3,4};
// 常量迭代器(只讀)
for (auto it = v.cbegin(); it != v.cend(); ++it) cout << *it << ',';
// 反向迭代器
for (auto rit = v.rbegin(); rit != v.rend(); ++rit) cout << *rit << ',';
// 非常量迭代器(可修改)
for (auto it = v.begin(); it != v.end(); ++it) *it = 100;

3.2 迭代器分類與操作

類別支援操作對應容器
雙向迭代器++ -- * == != =list, set, map, multiset, multimap
隨機存取迭代器雙向所有操作 + +n -n [] < <= > >=vector, deque

容器適配器(stack/queue/priority_queue)不支援迭代器。

四、算法概覽

4.1 設計原則

  • 算法即函數模板,多數在 <algorithm> 中。
  • 透過迭代器操作容器,實現容器無關性。
  • 許多算法接受區間 [first, last)(左閉右開)。
  • 可作用於容器,也可作用於原始數組。

4.2 典型算法原型

template 
InIt find(InIt first, InIt last, const T& val); // 返回指向 val 的迭代器,或 last

五、STL 中「大、小、相等」的語義

  • 預設以 operator< 定義「小」:x < y 為真 ⇔ x 比 y 小 ⇔ y 比 x 大。
  • 「相等」有兩種語境:
    • 無序區間算法(如 find):x == y 為真。
    • 有序區間算法/關聯容器:!(x < y) && !(y < x) 視為相等(即嚴格弱序下的等價)。
  • 使用者可自定義比較函數/函數對象,改變排序與相等判斷規則。

示例:自定義比較

class A {
    int v;
public:
    A(int v):v(v){}
    bool operator<(const A& a) const {
        cout << v << "<" << a.v << "? ";
        return v < a.v;
    }
};
// binary_search 會用 !(a

六、總結

  • STL 三支柱:容器、迭代器、算法。
  • 容器分類:順序、關聯、適配器。
  • 迭代器分類:雙向、隨機存取,不同容器支援不同類別。
  • 算法多為函數模板,定義於 <algorithm>。
  • 「大、小、相等」語義可自定義,預設基於 operator< 與 operator==。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved