ACM常用STL函数

发布时间 2023-11-25 21:54:23作者: supperwriter

max() min()

找多个元素的最大值和最小值

max(a,b)比较两个元素
mx = max({a,b,c,d});比较多个元素

lower_bound() upper_bound()

寻找第序列第n小的值的地址

//在a数组中查找第一个大于等于x的元素,返回该元素的地址
int *p = lower_bound(a,a+n,x);
//在a数组中查找第一个大于x的元素,返回该元素的地址
int *p = upper_bound(a,a+n,x);
其元素下标pos = p-a;

//如果未找到,返回尾地址的下一个位置的地址

reverse

对序列进行翻转

string s = "abcde";
reverse(s.begin(),s.end());//对s进行翻转
cout<<s<<'\n';//edcba

//对a数组进行翻转
int a[] = {1,2,3,4};
reverse(a,a+4);
cout<<a[0]<<a[1]<<a[2]<<a[3];//4321

__gcd(a,b)

求a和b的最大公约数

unique(beg,end)

头文件algorithm
要求:消除重复元素一般需要原序列是有序序列
消除重复元素,返回消除完重复元素的下一个位置的地址,复杂度O(N)
我们可以这么求解有序序列中不重复元素的个数:

int a[8]={1,2,3,3,3,5,6,7};
int len = unique(a,a+8)-a;//返回有序序列的长度
//最后一个不重复元素的下标为len-1

sort()

常见用法:排序

//对a数组的[1,n]位置进行从小到大排序
sort(a+1,a+1+n);

//对a数组的[0,n-1]位置从大到小排序:
sort(a,a+n,greater<int>());
//对a数组的[0,n-1]位置从小到大排序:
sort(a,a+n,less<int>());

//自定义排序,定义比较函数
bool cmp(node a,node b)
{
    //按结构体里面的x值降序排列
    return a.x>b.x;
}
sort(node,node+n,cmp);

cin加速

在ACM里,经常出现 数据集超大造成 cin TLE的情况(CCPC惨痛经历)。这时候大部分人(包括原来我也是)认为这是cin的效率不及scanf的错,甚至还上升到C语言和C++语言的执行效率层面的无聊争论。其 实像上文所说,这只是C++为了兼容而采取的保守措施。我们可以在IO之前将stdio解除绑定,这样做了之后要注意不要同时混用cout和printf 之类。
在默认的情况下cin绑定的是cout,每次执行 << 操作符的时候都要调用flush,这样会增加IO负担。可以通过tie(0)(0表示NULL)来解除cin与cout的绑定,进一步加快执行效率。

ios::sync_with_stdio(false);//消除输入输出缓存
cin.tie(0);//解除cin与cout的绑定,加快速率。

memset

常见用法:

常用于图论
memset(h,-1,sizeof h);//将h数组每个元素初始化为-1
memset(dis,0x3f,sizeof dis)//将dis数组每个元素初始化为1e9,近似于正无穷
memset(vis,0,sizeof vis)//将vis数组每个元素初始化为0,标记第i个点未被访问过

原理:
void *memset(void *s,int c,unsigned long n);
函数功能:为指针变量s所指的前n个字节的内存单元填充给定的int型数值c,它可以为任何数据进行初始化。换句话说,就是将数值c以单个字节逐个拷贝的方式放到指针变量s所指的内存中去。 注意:只将数值c的最低一个字节填充到内存。
-1在计算机中存储为:1111 1111,填充到int后为“1111 1111 1111 1111 1111 1111 1111 1111”,也是-1。
0在计算机中存储为:0000 0000,填充到int后为“0000 0000 0000 0000 0000 0000 0000 0000”,也是0。
0x3f在计算机中存储为:0011 1111,填充到int后为"0011 1111 0011 1111 0011 1111 0011 1111",十进制为为1,061,109,567。
剩下的看你们的现象发挥了
如果赋某个特定的数会出错,赋值特定的数建议使用fill()

memcpy

常见用法
memcpy(目标地址,源地址,字节数);

int a[M]={0,1,2};
int b[N]={0,0,0,0,0,0,0};
memcpy(b,a,sizeof(a));//将a数组的前M个数组复制到b数组的前M和位置

next_permutation(beg,end)

求序列的下一个排列,下一个排列是字典序大一号的排列
例如:n=3的全排序有:
123
132
213
231
312
321

a[3]={3,1,2};
next_permutation(a,a+3);
//此时a[3]={3,2,1}

_builtin 内置位运算函数

__builtin_popcount(x) 返回x的二进制形式中1的个数
__builtin_ffs(x) 二进制中对应最后一位1的位数,比如4会返回3(100)和lowbit极为相似对不

random_shuffle()

对序列随机重排

nth_element(beg,nth,end)

寻找第序列第n小的值