本文根據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\)):
未完待更……
完了。退役了,更不完了,有人接上這個坑就接上吧,我這給個源碼鏈接,如果有人接上這坑的話回復個鏈接,我給掛上,就算填了坑了。