//STL
vector, 变长数组,倍增的思想
size() 返回元素个数
empty() 返回是否为空
clear() 清空
front()/back()
push_back()/pop_back()
begin()/end()
[]
支持比较运算,按字典序
pair
first, 第一个元素
second, 第二个元素
支持比较运算,以first为第一关键字,以second为第二关键字(字典序)
string,字符串
size()/length() 返回字符串长度
empty()
clear()
substr(起始下标,(子串长度)) 返回子串
c_str() 返回字符串所在字符数组的起始地址
queue, 队列
size()
empty()
push() 向队尾插入一个元素
front() 返回队头元素
back() 返回队尾元素
pop() 弹出队头元素
priority_queue, 优先队列,默认是大根堆
size()
empty()
push() 插入一个元素
top() 返回堆顶元素
pop() 弹出堆顶元素
定义成小根堆的方式:priority_queue, greater> q;
stack, 栈
size()
empty()
push() 向栈顶插入一个元素
top() 返回栈顶元素
pop() 弹出栈顶元素
deque, 双端队列
size()
empty()
clear()
front()/back()
push_back()/pop_back()
push_front()/pop_front()
begin()/end()
[]
set, map, multiset, multimap, 基于平衡二叉树(红黑树),动态维护有序序列
size()
empty()
clear()
begin()/end()
++, -- 返回前驱和后继,时间复杂度 O(logn)
set/multiset
insert() 插入一个数
find() 查找一个数
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)
lower_bound()/upper_bound()
unordered_set, unordered_map, unordered_multiset, unordered_multimap, 哈希表
和上面类似,增删改查的时间复杂度是 O(1)
不支持 lower_bound()/upper_bound(), 迭代器的++,--
bitset, 圧位
bitset<10000> s;
~, &, |, ^
>>, <<
==, !=
[]
count() 返回有多少个1
any() 判断是否至少有一个1
none() 判断是否全为0
set() 把所有位置成1
set(k, v) 将第k位变成v
reset() 把所有位变成0
flip() 等价于~
flip(k) 把第k位取反
//常用的一些字符
#include
#include
using namespace std;
int main()
{
vector
a.size();
a.empty();//返回bool值
a.clear();//当前位置清空
//迭代器
vector
a.end();//表示最后一位置的下一个位置
struct soso
{
int x,y;
};
vector
return 0;
}
如何遍历
#include
#include
using namespace std;
int main()
{
第一种:
vector
for(int i = 0;i < a.size();i++) cout< cout<
第二种:
for(vector
cout<<*it<<' ';
cout<
第三种:
for(int x:a)cout<
}
push_back和pop_back的用法
首先声明一下:push_back(x)是用来添加x元素到最后的,而pop_back()则是删除最后那个元素的,从后往前删元素
PS:pop_back()括号里面不需要写什么
#include
#include
using namespace std;
int main()
{
vector
a.push_back(4);
for(auto x:a)cout<
a.pop_back();
a.pop_back();
for(auto x:a)cout<
}
队列和优先队列
关于队列常用的操作
q.push(1);//在元素插入一个元素
q.pop()//弹出队尾元素
q.front();//返回队头
q.back();//返回队尾
关于优先队列操作
a.push(1);//插入一个数
a.top();//取最大值
a.pop();//删除最大值
清空队列:q.queue
#include
#include
#include
using namespace std;
int main()
{
queue
priority_queue
priority_queue
struct soso
{
int a,b;
//需要重载运算符
bool operator < (const soso& alaso)const
{
return a < alaso.a;//重载小于号
}
};
priority_queue
d.push({1,2});
return 0;
}
//需要记住:大根堆对应重载小于号,小根堆重载大于号
关于栈的一些操作
插入一个元素:stk.push(x);
返回栈顶元素:stk.top();
弹出栈顶元素:stk.pop();
关于双端队列的操作(随机操作)
deque
q.begin();
q.end();
q.front();
q.back;
q.push_back(x);//在最后插入一个元素
q.push_front(x);//在最前插入一个元素
set
set用途:动态维护有序序列
定义:
set
multiset
set
it++; it--;
insert
把一个元素x插入到a中去:a.insert(x);
查找x:a.find(x);//找到了返回迭代器,如果没找到就返回a.end();
//所以
if(a.find(x) == a.end())//寻找x在不在a中
找到大于等于的最小迭代器:a.lower_bound(x);
找到大于x的最小元素迭代器:a.upper_bound(x);
map
可以说非常神奇了,定义的数据类型不管是什么类型都可以实现
#include
#include
二维map
简介:前面我们学习了二维的vector
,实际上就是一个vector
套一个vector
。map
当然也有二维的用法。
而二维的map
不仅仅能map
套map
,还能map
套set
。实际上map
套set
更容易理解。所以我们先学习map
套set
,然后再学习map
套map
。
map
套用set
为了帮助理解,我们举用一个生活中实际例子。全校有很多班级,每个班级每个人都会有中文名。现在我们需要用一种方式来记录全校的同学的名字。如果直接用一个set
记录,对于重名的同学,那么就没办法分辨了。
我们可以把全校的班级进行编号,对每一个班级建立一个set
,也就是每个班级都映射成一个set
,这样就能分辨不同班级的同名同学了。对于同班的同学来说,一般很少有重名的。
map
就定义上面描述的数据结构,和二维vector
一样,两个> >
中间的空格不能少了。
这样我们就可以进行插入和查询了。比如对 2班的yuhaoran
同学,我们s[2].insert("yuhaoran")
。然后查询yuhaoran
是不是一个 2班的人,s[2].count("yuhaoran")
。然后还可以把他从 2班删除,s[2].erase("yuhaoran")
。
map
套用map
上面的结构没有办法解决同班同名的情况。实际上,如果同班同名,单单通过名字本身是无法分辨的,需要通过其他特征来分辨。所以为了简单起见,我们只需要记录每个班级同名的人的个数。
这时候,我们把里面的set
改成map
即可。map
。2 班有一个yuhaoran
,s[2]["yuhaoran"]++
。2 班又转来了一个yuhaoran
,s[2]["yuhaoran"]++
。
#include
#include
unordered_set
unordered_multiset
unordered_map
return 0;
}
bitset
#include
using namespace std;
int main()
{
bitset<1000>a;//长度为1000位的串
a[0] = 1;
a[1] = 1;
cout<
}
输出为2