CSP 前夕——STL再度整理

一.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)定义:
  1. set < int > s;//有序集合
  2. 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的长度,即不同的元素的个数
  1. 数组: 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 : 排序
  • 不用说吧
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值