您的位置:首页 > 编程语言 > C语言/C++

【C++基础】算法题中那些常用的头文件

2020-07-27 19:01 218 查看

这里是我整理的一些算法题中常用的一些头文件以及它其中经常被用到的函数,持续更新!

cstdio/stdio.h

头文件cstdio/stdio.h是C/C++使用最频繁的文件,因为文件中包含很多常用的方法,如下所示:

<1> 格式化输入(scanf)/输出(printf)

scanf
printf
,是最常用的两个函数,在算法题中,一般用以格式化和大规模输入输出,输出和输入效率高于
cin
cout

<2> 文件操作

  1. fopen/fclose
    打开和关闭文件
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
return 0;
  1. remove
    删除文件
    rename
    重命名
#include <stdio.h>
using namespace std;

int main()
{
//重命名
const char oldname[] = "1.txt";
const char newname[] = "myfile.txt";
rename(oldname,newname);
//删除文件
remove( "myfile.txt" )
return 0;
}

<3>
getchar
putchar
gets
puts

getchar()
: 读一个字符
putchar('c')
:从标准输入设备输入字符c
gets()
:从标准输入设备读字符串,其可以无限读取,不会判断上限,以换行符结束读取
puts("a string")
:输入一个字符串,可以换行,所以可以用
puts("")
换行。

iostream

C++ 流式操作头文件,算法题用的最多的头文件之一

<1> cin / cout

C++中新增的输入和输出函数。

cin/cout
printf/scanf
的使用场景对比:

cin和cout 常常使用在输入/输入规模不大的场景,而printf和scanf常常使用在输入和输入规模大的场景,因为printf 和scanf 的效率要高于cin和cout ,但cin 和cout 使用更为方便,小规模基本上没有效率的问题。

值得一提的是:

如果你的编译器支持C++11标准及更高标准,

iostream
头文件包含了
cstdio
,也就是说仅仅
#include<iostream>
就可以使用
cstdio
的内容

cstring

该函数的头文件之下包含有很多实用的字符串函数,下面只介绍它们之中最常被使用的一部分。

<1>拷贝相关函数

memcpy

void* memcpy(void* destination,const void* source, size_t num)

从source指向的地址拷贝num bytes到destination指向的地址。不检查source中的空字符,总是拷贝num bytes,可能产生溢出,当destination和source的大小小于num时。

int a[] = {1,2,3,4,5,6};
int b[10];
//把a拷贝给b
memcpy(b,a, sizeof a);

strcpy

char * strcpy ( char * destination, const char * source )

将source指向的字符串拷贝到destination指向的地方。会检查空字符,遇空字符停止(字符串结束标志)。可能存在溢出。

char a[] = "a string";
char b[30];
strcpy(b,a);
puts(b)//输出 a string

strncpy

char * strncpy ( char * destination, const char * source, size_t num )

将source指向的字符串拷贝到destination指向的地方,最多拷贝num bytes,或者遇到空字符(字符串结束标志)停止。num可以防止溢出。

char a[] = "string";
char b[20];
strncpy(b,a,sizeof(char[4]));
puts(b);//输出:stri

<2> 连接相关函数

strcat

char * strcat ( char * destination, const char * source )

将source指向的字符串连接到destination指向的字符串的后面。当连接后的大小大于destination的大小时可能存在溢出。

char a[] = "astring";
char b[] = "bstring";
strcat(a,b);
puts(a);//astringbstring

strncat

char * strncat ( char * destination, const char * source, size_t num )

将source指向的字符串连接到destination指向的字符串的后面。最多连接num bytes。

char a[] = "astring";
char b[] = "bstring";
strncat(a,b,sizeof(char[4]));
puts(a);//astringbstr

<3>比较相关函数

memcmp

int memcmp ( const void * ptr1, const void * ptr2, size_t num )

比较ptr1、ptr2指向的内存块的前面num bytes,如果都相同则返回

0
,如果第一个不同byte ptr1的小于ptr2的,
返回负数
,否则
返回正数
。如果前面都相同,即使中间遇到空字符,也会继续比较下去,直到比较完所有的num bytes。

char a[] = "this is a string";
char b[] = "this is b string";
int arr1[] = {1,2,3,4,5};
int arr2[] = {1,2,4,3,5};
int arr3[] = {1,2,2,4,5};
//比较串a和串b 前9位和前7位
int isEqual = memcmp(a,b,sizeof(char[7])); // isEqual = 0
isEqual = memcmp(a,b,sizeof(char[9])); 	// isEqual = -1
//比较arr1和arr2前2位
isEqual = memcmp(arr1,arr2,sizeof(int[2])); //isEqual = 0

//整体比较
isEqual = memcmp(arr1,arr2,
sizeof arr1 >= sizeof arr2 ? sizeof arr1 : sizeof arr2); // isEqual = -1

//整体比较arr1和arr3
isEqual = memcmp(arr1,arr3,
sizeof arr1 >= sizeof arr3 ? sizeof arr1 : sizeof arr3); // isEqual = 1

strcmp

int strcmp ( const char * str1, const char * str2 );

比较str1、str2指向的字符串,直到遇到不相同的字符或者空字符结束。如果都相同则返回

0
,如果第一个不同byte ptr1的小于ptr2的,返回
负数
,否则返回
正数

char a[] = “this is a string”;

char b[] = "this is b string";
char c[] = "this is 1 string";
char d[] = "this is a string";
//比较字符串a b
int isEqual = strcmp(a,b);
cout << isEqual << endl; // -1
//比较字符串a c
isEqual = strcmp(a,c);
cout << isEqual << endl; // 1
//比较字符串a d
isEqual = strcmp(a,d);
cout << isEqual << endl;// 0

strncmp

int strncmp ( const char * str1, const char * str2, size_t num )

比较ptr1、ptr2指向的字符串,直到遇到不相同的字符或者空字符结束或者比较完前面的num bytes结束。如果都相同则返回

0
,如果第一个不同byte ptr1的小于ptr2的,返回
负数
,否则返回
正数

//效果和memcmp差不多,只是这个只能比较字符串

<4>检索相关函数:

memchr

const void * memchr ( const void * ptr, int value, size_t num );

void * memchr ( void * ptr, int value, size_t num );

在ptr指向的内存中的前num bytes中搜索值value,返回第一个value的指针,如果没有找到返回空指针。

char a[] = "this is a string";
void* aptr = memchr(a,'a',sizeof a); // aptr = 0x6afed3
aptr = memchr(a,'c',sizeof a); //aptr = 0;

strchr

const char * strchr ( const char * str, int character );

char * strchr ( char * str, int character );

在ptr指向的字符串中搜索值value,返回第一个value的指针,如果没有找到返回空指针。

char a[] = "this is a string";
void* aptr = strchr(a,'a'); // aptr = 0x6afed3
aptr = strchr(a,'c'); //aptr = 0;

<5> 其他函数

memset

void * memset ( void * ptr, int value, size_t num );

设置ptr指向的内存的前面num bytes的值为value

strlen

size_t strlen ( const char * str );

返回str指向字符串的长度,不包含空字符

cmath

<1>. 绝对值

整数绝对值 abs

int abs( int num );

函数返回参数num.的绝对值

长整形绝对值 labs

long labs( long num );

函数返回参数num的绝对值。

浮点数绝对值 fabs

double fabs( double arg );

函数返回参数arg的绝对值。

<2> 三角函数

直接调用对应的方法即可: 注意x 为弧度值 ,π 用 M_PI 宏表示

三角函数

double sin (double x);

double cos (double x);

double tan (double x);

反三角函数

double asin (double x);
结果介于[-PI/2,PI/2]

double acos (double x);
结果介于[0,PI]

double atan (double x);
反正切(主值), 结果介于[-PI/2,PI/2]

double atan2 (double, double);
反正切(整圆值),结果介于[-PI/2, PI/2]

<3> 指数函数

平方根 sqrt

double sqrt( double num );

函数返回参数num的平方根。如果num为负,产生域错误。

e的幂 exp

double exp( double arg );

函数返回 e (2.7182818) 的arg次幂。

3. 幂 pow

double pow( double base, double exp );

函数返回以参数base 为底的exp 次幂。如果base为零或负和exp 小于等于零或非整数时,产生域错误。如果溢出,产生范围错误

<4>对数函数

double log (double);
自然对数
double log10( double num );
以10为底的对数
//若要算以 a 为底的对数:
sum=log(x)/log(a);
(换底公式)

<5>其他常用函数

double modf( double num, double *i );

函数将参数num 分割为整数和小数,返回小数部分并将整数部分赋给i。
float floor( float arg );

double floor( double arg );

long double floor( long double arg );

double floor( Integral arg ); (C++11)

功能:返回一个小于传入参数的最大整数(向下取整)

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: