STL
C++ STL算法模板
vector
vector, 变长数组,倍增的思想
// 定义
vector<int> a;
vector<int> a(n);
vector<int> a(10, 3); //定义一个长度为10的vector,并初始化为3
// 函数
a.size() 返回元素个数
a.empty() 返回是否为空
a.clear() 清空
a.front() a.back()
a.push_back() a.pop_back()
a.begin() a.end() // 迭代器
// 遍历
for(auto x : a) cout << x << endl;
for(vector<int>::iterator i = a.begin(); i != a.end(); i ++) cout << *i << endl;
for(auto i = a.begin(); i != a.end(); i ++) cout << *i << endl;
for(int i = 0; i < a.size(); i ++)
[] // 支持随机化访问
支持比较运算,按字典序
vector<int> a(4, 3), b(3,4);
cout << (a < b) << endl; // ans = 1
pair
pair<int, int> p;
p.first, 第一个元素
p.second, 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
pair<int, pair<int,int> >
// 初始化
p = make_pair(10, "ab");
p = {20, "ac"};
string
string,字符串
string s;
s.size() / s.length() 返回字符串长度
s.empty()
s.clear()
s += str
s.substr(起始下标,(子串长度)) 返回子串
// s.substr(1, 2);
s.substr(1) //返回从1开始的所有子串
s.c_str() 返回字符串所在字符数组的起始地址
scanf("%s", str.c_str());
printf("%s\n", str.c_str());
queue
queue, 队列
// 没有clear()
queue<int> q;
// 清空 q = queue<int>();
q.size()
q.empty()
q.push() 向队尾插入一个元素
q.front() 返回队头元素
q.back() 返回队尾元素
q.pop() 弹出队头元素
priority_queue
priority_queue, 优先队列,默认是大根堆 就是大的排在前面
#include <queue>
priority_queue<int> q;
q.clear();
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue<int, vector<int>, greater<int> > q; // great<int> > 这边最好用空格分隔开
stack
stack, 栈
size()
empty()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque
deque, 双端队列
size()
empty()
clear()
front() back()
push_back() pop_back()
push_front() pop_front()
begin() end() //迭代器
[] // 支持随机访问
set+map
set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列
size()
empty()
clear()
begin()/end()
++, -- 返回前驱和后继,时间复杂度 O(logn)
set/multiset
// set里面没有重复元素,multiset里面有重复元素
set<int> s;
multiset<int> MS;
insert() 插入一个数
find() 查找一个数 // 不存在的话返回end()迭代器
count() 返回某一个数的个数
erase()
(1) 输入是一个数x,删除所有x O(k + logn)
(2) 输入一个迭代器,删除这个迭代器
lower_bound() / upper_bound()
lower_bound(x) 返回大于等于x的最小的数的迭代器
upper_bound(x) 返回大于x的最小的数的迭代器
map/multimap
insert() 插入的数是一个pair
erase() 输入的参数是pair或者迭代器
find()
[] 注意multimap不支持此操作。 时间复杂度是 O(logn)
// map<string, int> a;
// a["yxc"] = 1; 插入
// cout << a["yxc"] << endl; 查询
lower_bound()/upper_bound()
unordered
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 基于哈希表
和上面类似,增删改查的时间复杂度是 O(1)
内部无序, 不支持 lower_bound()/upper_bound(), 迭代器的++,--
bitset
bitset, 圧位
bitset<10000> s;
// 是正常的bool数组内存的1/8
~, &, |, ^
>>, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反