目录
前言
这次给大家整理出来了简单的数据结构与 STL 容器的用法
以下 STL 容器内容参考代码可参照附件
简单线性数据结构概念
- 栈:先进后出(FILO)的线性数据结构
- 队列:先进先出(FIFO)的线性数据结构
- 链表:一些结点穿成的链,每个结点存储了其下一个结点
- 双向链表:在链表基础上每个结点存储了其上一个链表结点
- 循环链表:首尾相连的链表
vector
向量,其实就是一个动态的数组
运算符/方法 | 含义 | 例子 |
---|---|---|
size | 动态数组大小 | v.size(); |
empty | 判断数组是否为空 | if (v.empty()) ... |
push_back | 向后插入内容 | v.push_back(3); |
operator[] | 访问某位置元素 | int a = v[3]; |
pop_back | 弹出最后一个元素 | v.pop_back(); |
clear | 清空动态数组 | v.clear(); |
insert | 在某位置插入一个 元素(时间复杂度 是 𝑂(𝑛) 的) | v.insert(3, 4); |
erase | 删除某个/某一些元素 | v.erase(v.begin(), v.begin() + 1); |
front, back, begin, end | 迭代器 | v.begin(); |
deque
双端队列,顾名思义可以 𝑂(1) 向头尾插入元素
运算符/方法 | 含义 | 例子 |
---|---|---|
size | 队列大小 | q.size(); |
empty | 判断链表是否为空 | if (q.empty()) ... |
push_back | 向后插入内容 | q.push_back(3); |
pop_back | 弹出最后一个元素 | q.pop_back(); |
push_front pop_front | 同理(向前插入、弹出最前) | |
clear | 清空队列 | q.clear(); |
insert | 在某位置前插入一个元素 | q.insert(it, 4); |
erase | 删除某个/某些元素 | q.erase(q.begin(),q.end()); |
front, back, begin, end | 迭代器 | q.end(); |
stack
栈,先进后出(FILO)
运算符/方法 | 含义 | 例子 |
---|---|---|
push | 向栈中推入内容 | s.push(3); |
pop | 弹出最后一个元素 | s.pop(); |
top | 查询栈顶元素 | int x = s.top(); |
queue
队列,先进先出(FIFO)
运算符/方法 | 含义 | 例子 |
---|---|---|
push | 向队列中推入内容 | q.push(3); |
pop | 弹出队列头元素 | q.pop(); |
front | 查询队列头元素 | int x = q.front(); |
list
链表,𝑂(1) 添加元素,𝑂(𝑛) 查询元素
运算符/方法 | 含义 | 例子 |
---|---|---|
push_back | 向后插入内容 | l.push_back(3); |
pop_back | 弹出最后一个元素 | l.pop_back(); |
push_front pop_front | 同理(向前插入、弹出最前) | |
clear | 清空链表 | l.clear(); |
insert | 在某位置前插入一个元素(时间复杂度是 𝑶(𝟏) 的) | l.insert(it, 4); |
erase | 删除某个位置元素 | l.erase(l.begin(),l.end()); |
front, back, begin, end | 迭代器 | l.end(); |
map
映射表,可以将下标和值设成各种类型,𝑂(log 𝑛) 添加元素,𝑂(log 𝑛) 查询元素对应的值
运算符/方法 | 含义 | 例子 |
---|---|---|
operator[] | 访问某位置元素 | mp["XiaoMing"] = 114; |
erase | 删除某个元素 | mp.erase("XiaoMing"); |
find | 查找某个元素(查找下标,有则返回值,无则返回尾指针) | auto it = mp.find("XiaoMing"); |
set
集合,自动排序、去重,𝑂(log 𝑛) 添加元素,𝑂(log 𝑛) 查询元素是否存在
运算符/方法 | 含义 | 例子 |
---|---|---|
insert | 添加元素 | st.insert(123); |
erase | 删除某个元素 | st.erase(123); |
find | 查找某个元素 | auto it = st.find(137); |
count | 计算某个元素出现 了多少次 | int x = st.count(136); |
lower_bound upper_bound | 查找第一个大于 (等于)给定元素 的元素位置 | auto it = st.lower_bound(4); |
附件
#include <iostream>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <list>
#include <map>
#include <set>
using namespace std;
int main() {
//向量 vector
vector <int> v = {1, 7, 2, 8, 9, 2};
vector <int> v1 = v;
v1.clear();
v1.push_back(100);
v1.push_back(200);
v1.pop_back();
v.insert(v.begin() + 1, 999);
v.insert(v.end() - 1, 998);
v.erase(v.begin() + 2, v.begin() + 5 + 1);
v.erase(v.begin(), v.begin() + 1);
for(auto a : v)
cout << a << ' ';
cout << '\n';
cout << v[0] << "\n\n";
//-----------------------------------------------
//双端队列 deque
deque <int> dq = {1, 7, 2, 8, 9, 2};
cout << dq.front() << ' ' << dq.back() << '\n';
cout << *dq.begin() << ' ' << *(--dq.end()) << '\n';
dq.pop_front();
dq.pop_back();
cout << dq.front() << ' ' << dq.back() << '\n';
dq.push_front(168123);
dq.push_back(619582);
cout << dq.front() << ' ' << dq.back() << '\n';
auto dqit = dq.begin();
++dqit;
++dqit;
++dqit;
cout << *dqit << '\n';
dq.insert(dqit, -777777);
cout << *dqit << ' ' << *(dqit + 1) << "\n\n";
//-----------------------------------------------
//栈 stack
stack <int> s = stack <int> ({1, 7, 2, 8, 9, 2});
cout << s.top() << '\n';
s.pop();
s.push(4);
cout << s.top() << "\n\n";
//-----------------------------------------------
//队列 queue
queue <int> q = queue <int> ({1, 7, 2, 8, 9, 2});
cout << q.front() << '\n';
q.pop();
q.push(4);
cout << q.front() << "\n\n";
//-----------------------------------------------
//链表 list
list <int> l = list <int> ({1, 7, 2, 8, 9, 2});
cout << l.front() << ' ' << l.back() << '\n';
cout << *l.begin() << ' ' << *(--l.end()) << '\n';
l.pop_front();
l.pop_back();
cout << l.front() << ' ' << l.back() << '\n';
l.push_front(168123);
l.push_back(619582);
cout << l.front() << ' ' << l.back() << '\n';
auto lit = l.begin();
++lit;
++lit;
++lit;
l.insert(lit, -777777);
cout << *lit << ' ' << *(lit--) << "\n\n";
//-----------------------------------------------
//映射表 map
map <string, int> mp;
mp["XiaoMing"] = 9999999;
mp["XiaiHong"] = 8888888;
cout << mp["XiaoMing"] << '\n';
cout << mp["Xiaogang"] << '\n';
mp.erase("XiaoMing");
cout << mp["XiaoMing"] << "\n\n";
//-----------------------------------------------
//集合 set
set <int> st = {1, 5, 2, 11, 10, 8};
cout << *(st.find(10)) << '\n';
st.insert(4);
cout << *(st.lower_bound(4)) << '\n'; //st.lower_bound(n) 返回大于等于 n 的第一个元素的位置
cout << *(st.upper_bound(4)) << '\n'; //st.upper_bound(n) 返回大于 n 的第一个元素的位置
st.erase(10);
cout << *(st.upper_bound(9)) << "\n\n";
//-----------------------------------------------
return 0;
}
尾声
如果这篇博客对您(您的团队)有帮助的话,就帮忙点个赞,加个关注!
最后,祝您(您的团队)在 OI 的路上一路顺风!!!
┬┴┬┴┤・ω・)ノ Bye~Bye~