慢慢把常用的函数总结下来

一.全排列:next_permutation

next_permutation
包含在头文件<algorithm>

int a[];
do
{

}
while(next_permutation(a,a+n));

例题:输出自然数1到n所有不重复的排列,即n的全排列,要求所产生的任一数字序列中不允许出现重复的数字。

#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define debug cout<<"ok"<<endl
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
int n,a[maxn];
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)a[i]=i;
    do{
        for(int i=1;i<=n;i++)printf("%5d",a[i]);
        cout<<endl;
    }while(next_permutation(a+1,a+1+n));
    return 0;
}

P1088 火星人
输入输出样例
输入

5
3
1 2 3 4 5
输出
1 2 4 5 3

#include<bits/stdc++.h>
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<stdio.h>
#include<cmath>
#define debug cout<<"ok"<<endl
typedef long long ll;
using namespace std;
const int maxn=1e5+10;
const int mod=1e9+7;
int n,a[maxn],m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)cin>>a[i];
    while(m--)//全排列m次就是题意中的第m大的数
        next_permutation(a+1,a+1+n);
    for(int i=1;i<=n;i++)printf("%d ",a[i]);//输出即可
    cout<<endl;
    return 0;
}

二.读写优化

inline int read()//快读
{
    int x=0,f=0;
    char ch=getchar();
    while(ch>'9'||ch<'0'){f|=(ch=='-');ch=getchar();}
    while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return f?-x:x;
}
ios::sync_with_stdio(false);//cin加速

读出优化

inline void write(int x)
{
    char f[200];
    int cnt=0,tmp=x>0?x:-x;
    if(x<0)putchar('-');
    while(tmp>0)f[cnt++]=tmp%10+'0',tmp/=10;
    while(cnt>0)putchar(f[--cnt]);
}

推荐数据较多时使用

三.返回容器内最大最小值

1.min_element(first,last)寻找范围内最小值,返回迭代器

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v;
    vector<int> ::iterator pos;
    v.push_back(1);
    v.push_back(3);
    v.push_back(-8);
    v.push_back(8);
    pos=min_element(v.begin(),v.end());
    cout<<*pos<<endl;
    return 0;
}

输出:-8

2.max_element(first,last)寻找范围内最大值,返回迭代器

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v;
    vector<int> ::iterator pos;
    v.push_back(1);
    v.push_back(3);
    v.push_back(-8);
    v.push_back(8);
    pos=max_element(v.begin(),v.end());
    cout<<*pos<<endl;
    return 0;
}

输出:8

四.复制函数

1.copy(first,last,result)将first到last区间的元素复制到result中:

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    int myints[]= {10,20,30,40,50,60,70};
    vector<int> myvector;
    vector<int>::iterator it;
    myvector.resize(7);
    copy ( myints, myints+7, myvector.begin() );
    for(int i=0; i<myvector.size(); i++)
        cout<<myvector[i]<<" ";
    cout<<endl;
    return 0;
}

2.亦可用于字符串中

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    char s[24]="123456789";
    char s1[24]="";
    copy(s,s+5,s1);
    cout<<s1<<endl;
    return 0;
}

五.容器删除函数

remove(first,last,value)将区间first到last区间中值为value的元素删除

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int num[]= {1,2,3,4,5,1,0};
    int *pbegin=num;
    int *pend=num+sizeof(num)/sizeof(int);
    pend=remove(pbegin,pend,1);
    for(int *p=pbegin; p!=pend; p++)
        cout<<*p<<" ";
    cout<<endl;
    return 0;
}

六.容器填充函数

fill(first,last,value)将区间first到last区间全部初始为value

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    vector<int> v(8);
    fill(v.begin(),v.end(),1);
    for(int i=0; i<v.size(); i++)
        cout<<v[i]<<" ";
    cout<<endl;
    return 0;
}

七.查找函数

find(first,last,value)查找first到last区间第一个值为value元素的位置,返回一个迭代器

#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int main()
{
    int num[]= {1,2,3,4,5};
    int *p;
    p=find(num,num+5,3);
    if(p==num+5)
        cout<<"Not found!"<<endl;
    else
        cout<<*p<<endl;
    return 0;
}

八.字符串转换整数

atoi(char);把字符串(字符char)转换成整型数的一个函数

#include <stdio.h>
#include <stdlib.h>
int main ()
{
    int data;
    data=atoi("123");
    printf("%d\n",data);
    return 0;
}

stoi;把字符串(string)转换成整数

typedef unsigned long long ll;
ll stoi(char *ss,ll l,ll r)//自己写一个字符串转整数。想知道为什么cstring里包含的stoi()用不了
{
    ll res=0;
    if(l>r)return 0;
    for (ll i=l;i<=r;i++)
    {
        res*=10;
        res+=ss[i]-'0';
    }
    return res;
}

九.欧拉筛

void init()
{
    memset(vis,false,sizeof(vis));
    vis[1]=vis[0]=true;
    for(int i=2;i<maxn;i++)
    {
        if(!vis[i])
            prime[cnt++]=i;
        for(int j=0;j<=cnt&&i*prime[j]<=maxn;j++)
        {
            vis[i*prime[j]]=true;
            if(i%prime[j]==0)break;
        }
    }
}

十.快速幂

typedef long long ll;
//ll mod=1e15;
ll qpow(ll a,ll n)//快速幂
{
    ll re=1;//贼快
    while(n)
    {
        if(n&1)
            re=(re*a)%mod;//必须膜不然就wa
        n>>=1;//注意是有“=”号的!
        a=(a*a)%mod;
    }
    return re;
}

十一.快速乘


inline ll qmul(ll x,ll y,ll p)
{
    ll z=(long double)x/p*y;
    ll res=(unsigned long long)x*y-(unsigned long long)z*p;
    return (res+p)%p;
}

下面这种更快,接近 O ( 1 ) O(1) O(1)但是范围一大(大概爆int吧)就会WA

inline ll qmul(ll x, ll y, ll P){
    ll L=x*(y>>25)%P*(1<<25)%P;
    ll R=x*(y&((1<<25)-1))%P;
    return (L+R)%P;
}

十二.截取部分字符串函数

c++中超好用的截取部分字符串的函数substr();
头文件为#include