0x70 stl (进阶指南)

vector

用vector 代替邻接表保存有向图

const int MAXN =  1e5+7;
vector<int> ver[MAXN],edge[MAXN];
//保存从x到y权值为z的有向边
void add(int x,int y,int z){
    ver[x].push_back(y);
    edge[x].push_back(z);
}
//遍历从x出发的所有边
for(int i=0;i<ver[x].size();i++){
    int y = ver[x][i],z = edge[x][i];
    //有向边(x,y,z);
}

queue

q.back();//队尾元素

priority_queue

priority_queue<int> q;
priority_queue<int,vector<int>,greater<int>> q;

懒惰删除法

并没有删除标记,可以记录一个过时标记
当到达堆顶的时候删除

deque

front/back//队头队尾元素
push_back//队尾入队
push_front
pop_front//对头出队
pop_back
clear//光

set 有序集合& multiset有序多重集

set.insert
set.find   iterater  or  sset.end    O(logn)
s.lower_bound(x)  >=元素最小的一个返回指向该元素的迭代器    O(logn)
s.upper_bound(x)  > 元素的最小一个返回指向该元素的迭代器
s.erase   O(logn)
s.count(x) 返回集合s中等于x的元素个数  O(k+logn) k为元素x的个数

map

size
empty
clear
begin
end
insert
erase
find
[]   检出存在
map<string, int> h;
char str[25];
for(int i=1;i<=n;i++){
    scanf("%s",str); h[str]++;
}
for(int i=1;i<=m;i++){
    scanf("%s",str);
    if(h.find(str) == h.end()) puts("0");
    else printf("%d\n",h[str]);
}

unordered_map

bitset

8位占用一个字节
采用了状态压缩的二进制数组
n位执行一次位运算的复杂度视为n/32

bitset<10000> s;  
~s        按位取反
&|^       返回对两个位数相同的bitset执行按位与或异或运算的结果
>>,<<  返回把一个bitset左移右移若干位的结果
==!=  返回两个bitset代表的二进制数是否相等
s[k]  表示s的第k位,即可以取值,也可以赋值
s.count  返回1的个数
若s所有位都为0 则是,s.any返回false  s.none 返回 true
若s所有位都为1 则是,s.any返回true  s.none 返回 false

s.set() 把s所有位变成1
s.sek(k,v) 把s的第k位改成 v,即s[k] = v
s.reset() 把s所有位变成0
s.resek(k) 把s的第k位改成 0,即s[k] = 0
s.flip() 把s所有位取反  s=~s
s.flip(k) 把s k位取反  s[k]^=1

algorithm

reverse          		//反转
unique   				//去重
random_shuffle			//随机打乱
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define pii pair<int, int>
#define psi pair<string, int>
#define ull unsigned ll
#define pb push_back
#define mp make_pair
#define X first
#define Y second
#define ld long double
const int N = 1E5 + 7;
#define INF ~0ULL
vector<int> v;

int main()
{
    int n;
    cin >> n;
    while (n--)
    {
        int now;
        cin >> now;
        v.push_back(now);
    }
    sort(v.begin(), v.end());
    for (auto it = v.begin(); it != v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
    int m;
    cin >> m;
    while (m--)
    {   
        random_shuffle(v.begin(), v.end());
        for (auto it = v.begin(); it != v.end(); it++)
        {
            cout << *it << " ";
        }
        cout << endl;
    }
}
next_permutation		//下一个排列
sort					//排序
lower_bound				//二分>=
upper_bound				//>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.0-0.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值