(总结ing)
目录
map
特性
key - value 键值对。map自动排序,每个key只出现一次。
函数
insert O(log n)
erase O(log n)
count O(log n)
只会返回 0或者 1,判断某个数是否存在。
find O(log n)
若存在返回迭代器,否则返回 mp.end()
void slove()
{
map<int, int> mp;
mp[1]++; mp[1]++; mp[2]++;
auto it = mp.find(1);
cout<<it->first<<endl;
cout<<it->second<<endl;
}
auto遍历
i.second = 0; 不改变原来的值。mp[i.first] = 0; 可以改变。
unordered_map
特性
内部数据是无序的,甚至和初始时的顺序都不一样。
函数
函数与map基本一样。查找速度O(1),其他方面耗时最坏能达到 O(n),容易被卡。(待验证)
vector
特性
基于倍增思想的可变长数组。vector不适合用于大量数据的插入和删除。
函数
push_back O(1)
将元素插到尾部
pop_back O(1)
将尾部元素删除
insert / erase O(n)
find O(n)
使用的是 algorithm的 find函数。
void slove()
{
vector<int> v;
v.push_back(1);
v.push_back(2);
v.push_back(3);
cout<< find(v.begin(), v.end(), 3) - v.begin() <<endl;
}
lower_bound O(log n)
返回第一个大于等于 x的数的地址。
cout<< lower_bound(v.begin(), v.end(), 2) - v.begin() <<endl;
upper_bound O(log n)
返回第一个大于 x的数的地址。
cout<< upper_bound(v.begin(), v.end(), 2) - v.begin() <<endl;
deque
特性
双端队列支持在两端高效插入或删除元素,支持随机访问。
函数
begin / end O(1)
头 / 尾迭代器
front / back O(1)
队头 / 队尾元素
push_back / pop_back O(1)
从队尾入队 / 出队
push_front / pop_front O(1)
从队头入队 / 出队
clear O(n)
清空队列
queue
特性
先进先出。
函数
push O(1)
从队尾入队
pop O(1)
从队头出队
front O(1)
队头元素
back O(1)
队尾元素
priority_queue
特性
优先队列具有队列的所有特性,包括基本操作,只是在它基础上添加了内部的一个排序,它本质是一个堆实现的。
可重载运算符 <
// 升序队列
priority_queue <int,vector<int>,greater<int> > q;
// 降序队列(默认类型-大顶堆)
priority_queue <int,vector<int>,less<int> >q;
函数
push O(log n)
插入元素
top O(1)
查询堆顶元素
pop O(log n)
删除堆顶元素
set
特性
有序集合,即元素不可重复。
函数
迭代器 ++ / - - O(log n)
begin / end O(1)
头部 / 尾部迭代器,end是最大元素的下一个位置。
insert O(log n)
插入元素,若已存在就不会再插入
find O(log n)
查找元素,返回迭代器,若不存在返回end。
lower_bound / upper_bound O(log n)
查找大于等于x / 查找大于x
erase O(log n)
删除迭代器指向的元素
count O(log n)
元素x的个数。
multiset
特性
有序可重复集合。
函数
函数和set的都一样,但erase和count的时间复杂度是O(k + log n)。
bitset
特性
bitset可看作一个多位二进制数。
函数
位运算操作符
~s
返回对bitset按位取反的结果
& | ^
返回对两个相同位数的bitset执行按位与,或,异或的运算结果。
>> <<
返回一个bitset右移,左移若干位的结果。
== !=
比较两个bitset是否相等
[ ]操作符
s[k]代表s的第k位。
count
s.count()返回有多少位1。
s.set() / s.reset()
把s所有位变为1
把s的所有位变为0
s.set(k, v) / s.reset(k)
把s的第k位变为v,即s[k] = v
把s的第k位改为0
s.flip()
把s的所有位按位取反
s.lip(k)
把s的第k位取反
any / none
若s所有位都为0,s.any()返回false,s.none()返回true
若s至少一位为1,s.any()返回true,s.some()返回false