C++ STL 數據結構模板的運用


本文根據CCF NOI 競賽大綱 的順序編寫。

棧(stack)

是一種先進后出的數據結構。使用 STL 的 stack 數據結構需要以下頭文件:

#include <stack>

以下是 stack 常用函數(用例中棧名為 \(s\)):

函數 語法 用例 作用 類型
push() 棧名.push(元素) s.push(a) 在棧頂插入新元素 操作
pop() 棧名.pop() s.pop() 彈出棧頂元素 操作
top() 棧名.top() a = s.top() 訪問棧頂元素 查詢
size() 棧名.size() len = s.size() 查詢棧中元素數量 查詢
empty() 棧名.empty() f = s.empty() 查詢棧是否為空 查詢

隊列(queue)

隊列是一種先進出的數據結構。使用 STL 的 queue 數據結構需要以下頭文件:

#include <queue>

以下是 queue 常用函數(用例中隊列名為 \(q\)​):

函數 語法 用例 作用 類型
push() 隊列名.push(元素) q.push(a) 在隊列末端插入新元素 操作
pop() 隊列名.pop() q.pop() 彈出隊列頭端元素 操作
front() 隊列名.front() a = q.front() 訪問隊頭元素 查詢
back() 隊列名.back() a = q.back() 訪問隊尾元素 查詢
size() 隊列名.size() len = q.size() 查詢隊列中元素數量 查詢
empty() 隊列名.empty() f = q.empty() 查詢隊列是否為空 查詢

鏈表(list)

鏈表是一種數據結構。使用 STL 的 list 數據結構需要以下頭文件:

#include <list>

鏈表的函數有點多啊,不是我說……

以下是 list 常用函數(用例中鏈表名為 \(l\)​)(參考了這篇博客):

函數 語法 用例 作用 類型
push_front() 鏈表名.push_front(元素) l.push_front(a) 在鏈表頭端插入新元素 操作
push_back() 鏈表名.push_back(元素) l.push_back(a) 在鏈表尾端插入新元素 操作
insert()(1) 鏈表名.insert(要插入元素的位置, 元素) l.insert(l.begin(), a) 在任意位置插入新元素 操作
insert()(2) 鏈表名.insert(要插入元素的位置, 要插入的數量, 元素) l.insert(l.begin(), 3, a) 在任意位置插入多個新元素 操作
insert()(3) 鏈表名.insert(要插入元素的位置, 要插入數據的起始位置, 要插入數據的結束位置) l.insert(l.begin(), v.begin(), v.end()) 插入另一個向量兩點之間的數據 操作
pop_front() 鏈表名.pop_front() l.pop_front() 彈出鏈表頭端元素 操作
pop_back() 鏈表名.pop_back() l.pop_back() 彈出鏈表尾端元素 操作
erase()(1) 鏈表名.erase(要刪除元素的位置) l.erase(l.end()) 刪除任意位置的元素 操作
erase()(2) 鏈表名.erase(要刪除元素的起始位置, 要刪除元素的結束位置) l.erase(l.begin(), l.end()) 刪除連續多個任意位置的元素 操作
clear() 鏈表名.clear() l.clear() 清空所有元素 操作
assign() 鏈表名.assign(賦值的數量, 要賦的值) l.assign(4, 5) 為鏈表賦多個初值 操作
swap()(1) 鏈表名1.swap(鏈表名2) l1.swap(l2) 交換兩個鏈表的值 操作
swap()(2) swap(鏈表名1, 鏈表名2) swap(l1, l2) 交換兩個鏈表的值 操作
merge() 鏈表名1.merge(鏈表名2) l1.merge(l2) 將一個鏈表合並入另一個鏈表,並按照鏈表的升序排列(注意不是鏈表中元素的升序);並將這個鏈表清空 操作
splice() 鏈表名1.splice(插入的位置,鏈表名2) l1.splice(l1.begin(), l2) 在一個鏈表的任意位置插入另一個鏈表;並將這個鏈表清空 操作
unique() 鏈表名.unique() l.unique() 刪除鏈表中相鄰的重復元素 操作
begin() 鏈表名.begin() l.begin() 鏈表開始迭代器指針 查詢
end() 鏈表名.end() l.end() 鏈表末尾迭代器指針 查詢
cbegin() 鏈表名.cbegin() l.cbegin() 指向常量的開始迭代器指針 查詢
cend() 鏈表名.cend() l.cend() 指向常量的末尾迭代器指針 查詢
rbegin() 鏈表名.rbegin() l.rbegin() 反向迭代器指針,指向最后一個元素 查詢
rend() 鏈表名.rend() l.rend() 反向迭代器指針,指向第一個元素的前一個元素 查詢
front() 鏈表名.front() a = l.front() 訪問鏈表頭元素 查詢
back() 鏈表名.back() a = l.back() 訪問鏈表尾元素 查詢
size() 鏈表名.size() len = l.size() 查詢鏈表中元素數量 查詢
empty() 鏈表名.empty() f = l.empty() 查詢鏈表是否為空 查詢

以下是 list 常用函數(用例中鏈表名為 \(l\)​):

  • 遍歷元素
list<int>::iterator it;
for (it = lst.begin(); it != lst.end(); it++)
    cout << *it << endl;
  • 元素翻轉
#include <algorithm>
reverse(lst.begin(), lst.end());
  • 元素排序
#include <algorithm>
sort(lst.begin(), lst.end()); // 采用的是從小到大的排序

// 如果想從大到小排序,可以采用先排序后反轉的方式,也可以采用下面方法:
// 自定義從大到小的比較器,用來改變排序方式
bool Comp(const int& a, const int& b) 
{
    return a > b;
}

sort(lst.begin(), lst.end(), Comp);

向量(vector)

向量是一種數據結構。使用 STL 的 vector 數據結構需要以下頭文件:

#include <vector>

以下是 vector 常用函數(用例中向量名為 \(l\)):

未完待更……

完了。退役了,更不完了,有人接上這個坑就接上吧,我這給個源碼鏈接,如果有人接上這坑的話回復個鏈接,我給掛上,就算填了坑了。

源碼鏈接


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM