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

STL 入門完全指南:容器、演算法、迭代器與函數物件

     編輯:關於C++

STL (Standard Template Library) 是 C++ 標準庫核心,提供高效、通用、可複用的資料結構與演算法。本文面向具備 C++ 模板基礎的初學者,系統介紹 STL 三大核心組件 (容器、演算法、迭代器) 及函數物件、配接器等進階組件,附 19 個可編譯執行的完整範例程式碼。

核心概念速覽

組件角色關鍵類別/函數
容器儲存資料的資料結構vector, list, deque, set, map, stack, queue
演算法操作容器資料的通用函數sort, find, copy, transform, accumulate
迭代器連接容器與演算法的泛型指標iterator, const_iterator, reverse_iterator
函數物件可像函數呼叫的物件less, greater, 自訂仿函數
配接器修改介面以符合需求stack/queue (容器配接), reverse_iterator (迭代器配接)

一、序列容器

1. vector — 動態陣列

  • 隨機存取 O(1),尾端增刪攤還 O(1),中間增刪 O(n)
  • 4 種建構函數:預設、指定大小、複製、區間
vector v1;                 // 空
vector v2(10, 6);          // 10 個 6
vector v3(v2.begin(), v2.begin()+3); // 區間複製
v1.push_back(2);                // 尾端新增
v1.insert(v1.begin()+1, 5);     // 中間插入
v2.assign(8, 1);                // 重新指派
cout << v1.front() << v1.back() << v1[4] << v1.at(4);
v1.pop_back(); v1.erase(v1.begin()+1, v1.end()-2);

2. deque — 雙端佇列

  • 支援雲端 push_front/pop_front,隨機存取、中間增刪同 vector
  • 無 capacity/reserve
deque dq;
dq.push_back(2); dq.push_front(5); // 雙端新增
dq.insert(dq.begin()+1, 3, 9);     // 中間插入 3 個 9

3. list — 雙向鏈結串列

  • 僅循序存取,雙向遍歷,任意位置增刪 O(1)
  • 無隨機存取、無 operator[]
  • 特有演算法:sort, merge, splice, unique
list L1, L2;
L1.sort(); L2.sort(); L1.merge(L2); // 合併兩有序串列
L1.splice(pos, L2);                 // 將 L2 插入 pos 前,L2 變空
L1.splice(pos, L2, it);             // 移動單一元素
L1.splice(pos, L2, first, last);    // 移動區間

二、關聯容器

1. set/multiset — 集合/多重集合

  • 紅黑樹實現,自動排序,set 鍵值唯一,multiset 允許重複
  • 迭代器為雙向且 const,不可修改元素值
set s; s.insert(3); // 回傳 pair
multiset ms; ms.insert(s.begin(), s.end());
ms.insert(arr, arr+10); // 可重複
// 集合運算:set_union, set_intersection, set_difference

2. map/multimap — 對應/多重對應

  • 鍵值對 pair,map 鍵唯一支援 operator[],multimap 鍵可重複不支援 []
map m; m['c']=3; m['a']=1;
for (auto& p : m) cout << p.first << ':' << p.second;

multimap mm;
mm.insert({"Tom", "student"}); mm.insert({"Tom", "boy"});
auto range = mm.equal_range("Tom"); // 取得所有 Tom 的值

三、演算法

標頭檔 <algorithm>,泛型函數不屬於容器成員,通用於任何迭代器區間。

1. 可變序列演算法

int a[6]={1,12,3,2,1215,90}, b[6]={2,5,6,9,0,-56}, c[7];
copy(a, a+6, c);           // 複製
reverse(a, a+6);           // 反轉
swap_ranges(a, a+6, b);    // 區間交換

2. 不可變序列演算法

vector v(a, a+10);
auto it = find(v.begin(), v.end(), 2);     // 查找單值
it = search(v.begin(), v.end(), v2.begin(), v2.end()); // 查找子序列
int cnt = count(v.begin(), v.end(), 5);    // 計數

3. 排序與合併演算法

sort(a, a+10);                    // 排序
merge(a, a+10, b, b+5, d);        // 合併兩有序區間
bool b = includes(a, a+10, b, b+5); // 區間包含關係

四、迭代器

標頭檔 <iterator>,6 種分類:

  • 輸入/輸出/前向/雙向/隨機存取/流迭代器
  • vector/deque:隨機存取;list/set/map:雙向
// 流迭代器範例:檔案→向量→螢幕
vector v;
copy(istream_iterator(file), istream_iterator(),
     inserter(v, v.begin()));
copy(v.begin(), v.end(), ostream_iterator(cout, " "));

五、函數物件

標頭檔 <functional>,重載 operator() 的類別。

// 自訂仿函數
struct IntMax { int operator()(int x, int y) const { return x>y?x:y; } };
cout << IntMax()(3,4); // 4

// STL 風格:繼承 unary_function/binary_function
struct Adder : unary_function {
    double sum = 0;
    void operator()(double x) { sum += x; }
};
Adder r = for_each(v.begin(), v.end(), Adder());
cout << "Sum: " << r.sum;

六、配接器

  • 容器配接器:stack (LIFO)、queue (FIFO)、priority_queue (堆積),底層預設 deque
  • 迭代器配接器:reverse_iterator (反向)、insert_iterator (插入)、ostream_iterator (輸出)
  • 函數配接器:not1/not2 (否定)、bind1st/bind2nd (綁定)、ptr_fun/mem_fun (函數指標轉仿函數) — C++11 後建議用 std::bind/Lambda

七、完整範例程式碼索引

檔案示範內容
stl_cpp_1.cpp傳統陣列平均值
stl_cpp_2.cppvector 基本操作與迭代器遍歷
stl_cpp_3.cppvector 進階插入/刪除/清除
stl_cpp_4.cpp函數模板 max
stl_cpp_5.cpp類別模板 ex_class
stl_cpp_6.cpp命名空間 namespace
stl_cpp_7.cppvector 區間建構
stl_cpp_8.cppvector 完整功能演示
stl_cpp_9.cppdeque 完整功能演示
stl_cpp_10.cpplist sort/merge/splice
stl_cpp_11.cppset/multiset 插入與集合運算
stl_cpp_12.cppmap 基本操作
stl_cpp_13.cppmultimap 多值查找
stl_cpp_14.cpp可變序列演算法 copy/reverse/swap
stl_cpp_15.cpp不可變序列演算法 find/search/count
stl_cpp_16.cpp排序演算法 sort/merge/includes
stl_cpp_17.cpp流迭代器檔案處理
stl_cpp_18.cpp自訂仿函數 IntMax
stl_cpp_19.cppSTL 風格仿函數 Adder + for_each

八、編譯環境與建議

  • 測試環境:Windows 2000 + Dev-C++ 4.9.9.0 / VC6.0
  • 標準 int main() { return 0; }、#include <iostream> using namespace std;
  • 純 C++ 學習建議輕量編輯器 (Dev-C++, VS Code) 避免 IDE 干擾
  • DOS 程式末尾加 cin.get(); 暫停觀察結果

結語

掌握「容器儲資料、演算法處理資料、迭代器串連兩者」的核心三角關係,即掌握 STL 精髓。建議先跑通 19 個範例,再嘗試修改資料型別、替換演算法、組合容器,體會泛型程式設計的威力。STL 是現代 C++ 開發者的必修課,早精通早受益。

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