【笔记】STL 容器

动态数组 vector

#include <vector>
vector <int> v; // 定义一个int型的动态数组
v.push_back(x); // 在尾部插入一个int型的元素x
v.pop_back(); // 删除尾部元素
v.size() // 返回v容器的大小
v.front() // 返回头部元素
v.back() // 返回尾部元素
v.begin() // 返回头元素的迭代器
v.end() // 返回尾部元素的迭代器
v.clear() // 清空vector
v.empty() // 返回v是否为空

队列 queue

#include <queue>
queue <int> q;
q.push(x) // 向尾部插入元素
q.front() // 返回首元素
q.back() // 返回尾部元素
q.size() // 返回队列内元素个数
q.pop() // 删除队列首部元素
q.empty() // 返回是否为空

优先队列/堆 priority_queue

#include <queue>
priority_queue <int> q; // 定义int类型的优先队列,数字大的优先级高(大根堆)
priority_queue <int,vector<int>,greater<int>> q; // 数字小的优先级高(小根堆)
基本函数同 queue
q.top() // 返回队首元素(即优先度最高的元素)
定义的数据类型必须有优先级的比较规则,若是自己声明的结构体类型,则需要重载运算符。
如(dij)
struct node {
	int num, dis;
	bool operator < (const node &o) const {
		return dis > o.dis;
	}
};

双端队列 deque

#include <deque>
deque <int> d; // 定义一个双端队列
d.begin(), d.end(); // 返回首、尾迭代器
d.front(), d.back(); // 返回首尾元素
d.push_front(),d.push_back(); // 分别向队首、队尾插入元素
d.pop_front(),d.pop_back(); // 分别删除队首、队尾的元素
d.clear(); // 清空队列

栈 stack

#include <stack>
stack <int> st; // 定义栈
st.top() // 返回栈顶元素
st.push() // 栈顶加入元素
st.size() // 返回当前栈的大小
st.pop() // 从栈顶弹出元素
st.empty() // 返回栈是否为空

字符串 string

#include <string>
string S;// 定义一个字符串
S[i] // 返回下标为i的字符
S.length(), S.size(); // 返回字符串长度
getline(cin, S);  // 读入一整行
cin >> S; // 读到空格为止
S=“abcd”; // 赋值
S=A+B; S=A+“abc”; // 字符串相加
S==“abcd”; // 字符串判等

集合 set

#include <set>
set <int> s; // 定义一个集合
s.empty(); // 判断集合是否为空
s.size(); // 返回集合的大小
s.clear(); // 清空集合
s.begin(), s.end(); // 返回集合的首尾迭代器
s.insert(x); // 在集合中插入x
s.erase(x); // 在集合中去掉x
s.find(x); // 返回集合中元素x的迭代器
s.lower_bound(x), s.upper_bound(x); // 分别返回集合中大于等于和大于x的第一个元素
有序性,不可重复性

可重集 multiset

#include <set>
multiset <int> s; // 定义一个可重集合
基本函数与set相同
s.erase(x); // 删除所有x元素
s.erase(it); // it是迭代器,只删除该迭代器对应的元素
s.count(x); // 返回集合中x的个数
有序性,可重复性

只删除单个元素:
multiset<int>::iterator it;
if ((it=s.find(a))!=e.end()) s.erase(it);

二进制数 bitset

#include <bitset>
bitset <100000> b; // 定义一个二进制数
b.count(); // 返回1的个数
b.any(), b.none(); // 若至少有一个1,前者位1,后者为0;反之则反
b.set(), b.reset(); // 全部置为1或0
b.set(x, y); // 把第x个数字变成y
b.reset(x); // 把第x个数字变成0
b.flip(); // 全部按位取反
b.flip(x); // 第x个数字取反
b[x] = true; // 给第x的数字赋值
同时支持基本的位运算符号的直接应用,如 b <<= 1;

映射 map

#include <map>
map <char,int> m; // 定义一个映射关系
m.begin();  m.end(); // 返回首尾迭代器
m.size(); // 返回当前映射关系数量
m.clear(); // 清空
m[‘a’] = 1; // 建立由‘a’指向1的映射
m.erase(x); // 删除x指出的映射
m.find(x); // 返回从x指出的映射的迭代器
m.count(x); // 返回是否有从x指出的映射

可持久化数组/平衡树(就很强,不过不是所有 oj 都能用)

#include <ext/rope>
using namespace __gnu_cxx;
rope<int> rp; // 一般用法和 string 类似,下标从 0 开始
r = rp; // 直接赋值
rp.push_back(x); // 末尾插入 x
rp.insert(pos, x); // 插入元素 x 使得它成为序列第 pos 个
rp.erase(pos, x); // 从 pos 开始删除 k 个
rp.replace(pos, x); // 从 pos 开始替换成 x
rp.at(x); // 访问第 x 个元素
posted @ 2021-08-02 19:32  zrkc  阅读(44)  评论(0)    收藏  举报