ACM——常用函数总结

廉价感情. 提交于 2019-12-11 03:28:08

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

一.全排列: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'){if(ch='-')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加速

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

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;
}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!