一.vector
1)定义: vector < int > a;
- 其实就是一个不定长(动态)的数组,即你存多少元素他就占多少的存储空间
2)具体操作:
1.a.size():返回vector数组a的实际长度
2.a.empty():返回vector数组a是否为空,若为空,则返回1
3.a.clear():清空a数组
4.a.push_back(x):在a后面插入元素x,相当于数组的a[++len] = x
5.a.pop_back():弹出末尾的元素
6.a.back() / a.front():返回末尾/开头的元素
7.a.begin / a.end():指向第一个元素的迭代器和vector的尾部(前闭后开)
3)遍历数组
- vector是支持随机访问的,用法与数组相同.但下标是从0开始的
for (int i = 0; i < a.size(); i++) cout<<a[i]<<' ';
4)迭代器遍历
- 迭代器相当于stl的指针,可以用*引用
声明方法:vector < int >::iterator it
此时就可以和上述7.一起用了
for (vector < int > :: iterator it = a.begin(); it != a.end(); it++) cout<<*it<<endl;
当然vector也可以用来建图
二.queue
1)循环队列
定义:queue < int > q;
具体操作:
1.q.push(x)
2.q.pop()
3.q.front()
4.q.size() / q.empty()
q.back()
2.优先队列
定义:
1.
大
根
堆
:
p
r
i
o
r
i
t
y
_
q
u
e
u
e
<
i
n
t
>
q
/
p
r
i
o
r
i
t
y
_
q
u
e
u
e
<
i
n
t
,
v
e
c
t
o
r
<
i
n
t
>
,
l
e
s
s
<
i
n
t
>
>
q
;
1.大根堆: priority\_queue < int > q\ /\ priority\_queue <\ int\ ,\ vector\ <\ int\ >\ ,\ less\ <\ int\ >\ >\ q;
1.大根堆:priority_queue<int>q / priority_queue< int , vector < int > , less < int > > q;
2.
小
根
堆
p
r
i
o
r
i
t
y
_
q
u
e
u
e
<
i
n
t
,
v
e
c
t
o
r
<
i
n
t
>
,
g
r
e
a
t
e
r
<
i
n
t
>
>
q
;
2.小根堆 \ priority\_queue <\ int\ ,\ vector\ <\ int\ >\ ,\ greater\ <\ int\ >\ >\ q;
2.小根堆 priority_queue< int , vector < int > , greater < int > > q;
3.pair类型小根堆:
p
r
i
o
r
i
t
y
_
q
u
e
u
e
<
p
a
i
r
<
i
n
t
,
i
n
t
>
,
v
e
c
t
o
r
<
p
a
i
r
<
i
n
t
,
i
n
t
>
>
,
g
r
e
a
t
e
r
<
p
a
i
r
<
i
n
t
,
i
n
t
>
>
>
q
priority\_queue <\ pair\ <\ int\ ,\ int\ >\ ,\ vector\ <\ pair\ <\ int\ ,\ int\ >\ >\ ,\ greater\ <\ pair\ <\ int\ ,\ int >\ >\ > q
priority_queue< pair < int , int > , vector < pair < int , int > > , greater < pair < int , int> > >q
4.pair类型大根堆:
p
r
i
o
r
i
t
y
_
q
u
e
u
e
<
p
a
i
r
<
i
n
t
,
i
n
t
>
,
v
e
c
t
o
r
<
p
a
i
r
<
i
n
t
,
i
n
t
>
>
,
l
e
s
s
<
p
a
i
r
<
i
n
t
,
i
n
t
>
>
>
q
priority\_queue <\ pair\ <\ int\ ,\ int\ >\ ,\ vector\ <\ pair\ <\ int\ ,\ int\ >\ >\ ,\ less\ <\ pair\ <\ int\ ,\ int >\ >\ > q
priority_queue< pair < int , int > , vector < pair < int , int > > , less < pair < int , int> > >q
具体操作:
1.q.top(): 返回堆顶元素
2.q.push(x) : 将元素x放入堆
3.q.pop() : 弹出堆顶元素
3.双端队列
定义: deque < int > q
具体操作:
1. []: 可随机访问
2. q.begin() / q.end()
3. q.front() / q.back()
4. q.push_back(x) / q.push_front(x)
5. q.pop_back() / q.pop_front()
6. q.clear()
三、set
1)定义:
- set < int > s;//有序集合
- multiset < int > s;//有序多重集
2)具体操作:
1. s.size() / s,empty() / s.clear()
2. s.begin() / s.end()
3. set < int > :: iterator it
4. s.insert(x):插入x
5. s.find(x): 寻找元素x,并返回指向该元素迭代器
6. s.lower_bound(x) , s.upper_bound(x)
7. s.erase(it) : 删除迭代器it指向的元素 / s.erase(x) : 删除集合中所有大小为x的元素
8. s.count(x) : 返回集合中x元素的个数
四、map
1)定义: map < 类型1 , 类型2 > M;
- 即将类型1映射到类型2 , 相当于hash吧
2)具体操作
1. [ ] : 直接访问
//其他的用不太到,也跟上面的类似
五. biset
1)定义: biset < 10000 > s;
- 相当于一个10000位的二进制数组
2)具体操作
1. 位运算操作符
- ~s : 将s取反
- & , | , ^ : 返回两个biset按照位运算执行的结果
- << , >> ,返回把一个biset左移、右移若干位的结果
2. [ ]:直接操作
3. s.count(): 返回有多少位是1
4. s.any(): 若所有为都为0,则返回false;若至少有一位是1,则返回true
5. s.none():若s至少有一位是1,则返回false;若都是0,则返回true
6. s.set(): 把s所有位都变成1
7. s.reset() : 把s的所有位变成0
8. s.flip() : 把s的所有位取反
五、序列上的函数操作
1)reverse :翻转
1.
v
e
c
t
o
r
:
r
e
v
e
r
s
e
(
a
.
b
e
g
i
n
(
)
,
a
.
e
n
d
(
)
)
;
1. vector : reverse(a.begin() , a.end() );
1.vector:reverse(a.begin(),a.end());
2.
数
组
:
r
e
v
e
r
s
e
(
a
+
1
,
a
+
n
+
1
)
;
2. 数组 : reverse(a+1,a+n+1);
2.数组:reverse(a+1,a+n+1);
2) unique : 去重
- 可以用于离散化
1. v e c t o r : i n t m = u n i q u e ( a . b e g i n , a . e n d ( ) ) − a . b e g i n ( ) ; vector : int\ m = unique(a.begin , a.end()) - a.begin(); vector:int m=unique(a.begin,a.end())−a.begin();//此时m返回的是去重后vector的长度,即不同的元素的个数
- 数组: i n t m = u n i q u e ( a + 1 , a + n + 1 ) − ( a + 1 ) int\ m = unique(a+1 , a+n+1) - (a+1) int m=unique(a+1,a+n+1)−(a+1)
例如 a [ ] = { 1 , 1 , 2 , 3 , 3 , 4 } a[] = \{1,1,2,3,3,4\} a[]={1,1,2,3,3,4},那么通过一番操作后 m = 4 , a [ ] = { 1 , 2 , 3 , 4 } m = 4\ ,\ a[]=\{1,2,3,4\} m=4 , a[]={1,2,3,4}
3) next_permutation : 全排列
for (int i = 1; i <= n; i++) a[i] = i;
do{
for (int i = 1; i <= n; i++) cout<<a[i]<<' ';
}while (next_permutation(a+1,a+n+1));
4) sort : 排序
- 不用说吧