常用函数[个人总结]及其对应的头文件

C++根据二分查找的函数(查找的数组必须有序)

algorithm

根据本人亲身经历,包含#include之后使用using namespace std;
也就是需要在使用algorithm里面的方法的时候,不仅需要包含头文件:
#include<algorithm>
using namespace std;

针对c++根据二分查找(查找的数组必须有序)定义的函数[包括(binary_search、lower_bound、upper_bound)],待排序查找的元素可以放在数组里也可以放在vector里面

sort(arr,arr+n(,cmp));//排序
reverse(str.begin(),str.end());//将字符串颠倒
binary_search(first,last,value(,cmp)) //查找某个元素是否出现。
//若在数组中查找到则真,若查找不到则返回值为假。
lower_bound(first,last,value(,cmp)) //查找第一个大于或等于某个元素的位置。
//lower_bound:从数组的begin位置到end-1位置二分查找第一个小于或等于num的数字的位置,找不到则返回end[最后一个元素的下一个位置]。用这个地址减去first则得到数组的下标
upper_bound(first,last,value(,cmp))//查找第一个大于某个元素的位置。
//upper_bound:从数组的begin位置到end-1位置二分查找第一个大于num的数字的位置,找不到则返回end[最后一个元素的下一个位置]。用这个地址减去first则得到数组的下标
find(arr,arr + sizeof(arr)/sizeof(arr[0]),key);//返回一个指针,该指针减去数组首地址即得下标,找不到时则返回arr + sizeof(arr)/sizeof(arr[0])[最后一个元素的下一个位置]。
next_permutation(p,p + n);//求下一个排列(支持可重集(包含重复元素的集合))
/生成全排列的示例程序
sort(str.begin(), str.end());
cout << str << endl;
while (next_permutation(str.begin(), str.end()))
{
        cout << str << endl;
}
vector<double> vec{ 2.1, 1.1, 4.1, 3.1 };
auto p = minmax_element(vec.begin(), vec.end());//同时求最小最大值,返回一个pair<vector<double>::iterator,vector<double>::iterator>类型
min_element(vec.begin(), vec.end());//求最小值
max_element(vec.begin(), vec.end());//求最大值

stdlib.h

abs();//fabs();
atof();
atoi();
malloc(unsigned size);//分配size个字节的存储空间
//分配内存空间的地址;如不成功,返回0
void *realloc(void *p,unsigned size)//叠加分配
free(p);//释放p所指的内存区

生成一个随机数

//生成[0,RAND_MAX] (闭区间)内的随机整数
//RAND_MAX是一个常数
rand();

//产生区间[0,n - 1]之间的一个随机数:
rand() % n;
//得到[0,1]之间的随机实数
//扩大n倍后四舍五入即可得[0,n]之间的随机实数
double n = (double)rand() / RAND_MAX;

//在程序执行之前,需要执行srand(time(NULL))以初始化“随机数种子”
//如果不执行该函数直接执行rand(),就会默认调用srand(1);
//因此我们始终会得到同一套随机数

//请注意:
//srand()函数只需要在程序开头调用一次,而不能在同一个程序中多次调用
//此处需要引入#include<time.h>
srand((unsigned)time(NULL))

string.h

memcpy(b,a,sizeof(int) * len)
 //该函数可以用来处理二维数组的复制。充分证明二维数组的存储方式其本质是一维存储
memset(arr,0,sizeof(arr));
//memset()只有在初始化-1,0时才会正确。想要初始化为其他值,只能自行设置循环赋值

清空字符数组的三种方式

// 利用memset清空字符数组(请记住:'\0'的ascii码是0):
memset(a, 0, sizeof(a));
memset(a, '\0', sizeof(a));
a[0] = '\0';

请注意:
曾经一度认为memset()只能应用于c语言int数组中0或者-1的初始化;
事实上memset()是可以应用于字符数组的初始化的。比如memset(a,’#’,sizeof(a));
造成这样错误的理解是在于不理解memset()的工作原理

memset()是针对数组中的每个元素的每一个字节初始化。
比如a[0] = 01100110 01101110 01001010 01011100
如果采用了memset(a,1,sizeof(a)):
a[0] = 00000001 00000001 00000001 00000001[这种二进制表示很明显不是1]
因此memset()可以用于整数数组初始化为0或者-1完全是个巧合
0为什么是巧合很明显,-1为什么是巧合请读者自证(提示:-1的二进制补码是11111111 11111111 11111111 11111111)
而字符数组中的元素是字符,只占用一个字节,因而是可以使用memset()来完成初始化的


math.h

//求某个数的n次方根
pow(x,1 / (double)n);
abs();
double exp(double x);//返回指数函数e^x的值 
double log(double x);//返回ln(x)的值 
double log10(double x) //返回log<sub>10</sub>x的值 
double log2(double x) //返回log<sub>2</sub>x的值 
double pow(double x,double y) //返回x^y的值 
double pow10(int p) //返回10^p的值
double sqrt(double x) //返回√(x)的值
double sin(double x);//返回正弦值
double cos(double x);//返回余弦值
double tan(double x);//返回正切值
double asin(double x);//返回反三角正弦值
double acos(double x);//返回反三角余弦值,  此处有一个技巧: PI = acos(-1).因为cos(PI) = -1;
double atan(double x);//返回反三角正切值,  
float hypot(float x, float y);//对于给定的直角三角形的两个直角边,求其斜边的长度。

ctype.h

isalpha();
isdigit();
isxdigit();//是否为16进制数
islower();
isupper();
toupper();
tolower();

time.h

clock();//该函数返回程序从启动之后到目前为止的执行时间(包括整个程序的运行时间)。
//CLOCKS_PER_SEC是一个常数
//clock()函数的返回值除以CLOCKS_PER_SEC即得以秒为单位的数值
printf("%.2f",(double)clock()  / CLOCKS_PER_SEC) 

因为clock统计的是程序从启动之后的时间,为了减少键盘输入的时间
可以采取命令行的方式来输入数据
eg:
windows: echo m | abc 其中abc是程序名称
linux: echo | ./abc


stdio.h

%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%hd 对应short数据类型
%ld 对应long数据类型
%lld 对应long long

freopen("in.txt","r",stdin);//输入输出的重定向
//更常见的用法是用于本地实现文件输入输出,提交到online_judge时采用标准输入输出,下面代码是该用法的示例
//如果LOCAL宏已被定义或者编译选项包含LOCAL(gcc 1.cpp -o test -DLOCAL),
//则执行输入输出重定向。否则为标准输入输出
#ifdef LOCAL
      freopen("in.txt","r",stdin);//输入输出的重定向s
#endif

scanf("%d.%d.%d.%d",&pq[i][0],&pq[i][1],&pq[i][2],&pq[i][3]); // 可以精确读取192.85.160.178

printf("%d",n);//左对齐
printf("%04d",n);//右对齐
sprintf(buf,"%d",s);//将数字转成字符串

参考程序设计竞赛——C++常用库函数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值