0
点赞
收藏
分享

微信扫一扫

C++的一些基础函数(来源于网络)

灵魂跑者 2022-02-03 阅读 107

一、fill 填充

·头文件:#include < algorithm >

·作用:填充数组或者容器以你想要的内容

·写法 fill(arr+start,arr+end,num);

          fill(myvector.begin(), myvector.end() , num);

例子: int a[100]={0}; fill(a+2,a+10,5);

这样数组a就会变成 0 0 5 5 5 5 5 5 5 5 0 0 0 0 0 0 0……

int main()
{
    int a[100]={0}; fill(a+2,a+10,5);
    for(int i=0;i<100;i++)
    {
    	printf("%d ",a[i]);
	}
    return 0;
}

二、next_permutation 全排列

·头文件: #include < algorithm >

·用法 next_permutation(arr,arr+size);

·作用:产生该数组的下一全排列

int main()
{
    int n=4;
    int a[4]={0};
    for(int i=0;i<n;i++)a[i]=i;	
	while(next_permutation(a,a+n)){
		for(int i=0;i<n;i++)
		{
			printf("%d ",a[i]);			
		}
		printf("\n");
 	}//产生该数组的下一全排列
    return 0;
}
/*如果有相同的数字,不会出现重复的排列。
它也能为字符串排列,都是按照字典序排序的,因为char类型是以unsigned_int类型储存的*/

三、sprintf()函数的使用

sprintf的作用是将一个格式化的字符串输出到一个目的字符串中

int main()
{
   char buffer[80];
   //一定要在调用sprintf之前分配足够大的空间。
   sprintf(buffer, "An approximation ofPi is %f\n", M_PI);
   puts(buffer);
   return 0;
}

spritnf 在大多数场合可以替代itoa

//把整数123 打印成一个字符串保存在s 中。
sprintf(s, "%d", 123); //产生"123"

//可以指定宽度,不足的左边补空格:
sprintf(s, "%8d%8d", 123, 4567); //产生:" 123 4567"

//当然也可以左对齐:
sprintf(s, "%-8d%8d", 123, 4567); //产生:"123 4567"

//也可以按照16 进制打印:
sprintf(s, "%8x", 4567); //小写16 进制,宽度占8 个位置,右对齐
sprintf(s, "%-8X", 4568); //大写16 进制,宽度占8 个位置,左对齐

/*打印16 进制内容时,通常想要一种左边补0的等宽格式,
	在表示宽度的数字前面加个0就可以了。*/
sprintf(s, "%08X", 4567); //产生:"000011D7"
//以”%d”进行的10 进制打印同样也可以使用这种左边补0 的方式

连接字符串

sprintf 的格式控制串中既然可以插入各种东西,并最终把它们“连成一串”,自然也就能够连 接字符串,从而在许多场合可以替代strcat,但sprintf 能够一次连接多个字符串(自然也可以同时 在它们中间插入别的内容,总之非常灵活)。

int main()
{
	char s[50];
	char* who = "I";
	char* whom = "CSDN";
	sprintf(s, "%s love %s.", who, whom); //产生:"I love CSDN. "
	puts(s);
	return 0;
}

如何解决非法内存操作

int main()
{
	char s[50];
	char a1[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G'};
	char a2[] = {'H', 'I', 'J', 'K', 'L', 'M', 'N'};
	sprintf(s, "%.7s%.7s", a1, a2);//产生:"ABCDEFGHIJKLMN"
	puts(s);
	/*这可以类比打印浮点数的”%m.nf”,在”%m.ns”中,m 表示占用宽度
	n 才表示从相应的字符串中最多取用的字符数。通常在打印字
	符串时m 没什么大用,还是点号后面的n 用的多。*/
	return 0;
}

例子:产生10 个[0, 100)之间的随机数,并将他们打印到一个字符数组s 中

int main() {
	char s[64];
    srand(time(0));
	int offset = 0;
	for(int i = 0; i < 10; i++) 
	{
		offset += sprintf(s + offset, "%d, ", rand() % 100);
	}
	s[offset - 1] = '\n';//将最后一个逗号换成换行符。
	puts(s);
	return 0;
}

四、reverse()函数

//1.reverse函数反转string
int main() {
	string s;cin>>s;
	reverse(s.begin(), s.end());
	cout<<s<<endl;
	return 0;
}
//2.reverse函数反转字符数组
int main() {
	char a[100];
	cin.getline(a,sizeof(a));
	reverse(a,a+strlen(a));
	puts(a);
	return 0;
}

五、swap 交换函数

作用:交换变量/数组/容器 等

int a=1,b=2;
swap(a,b);
int a[]={1,2,3};
int b[]={3,2,1};
swap(a,b);
int main()
{
    vector<int>V1(10,10),V2(10,5);	//容器
    for(vector<int>::iterator it=V1.begin();it!=V1.end();it++)
        cout << *it << " ";
    swap(V1,V2);
    puts("");
    for(vector<int>::iterator it=V1.begin();it!=V1.end();it++)
        cout << *it << " ";
    return 0;
}

六、数据对

·头文件: #include< utility >

·定义方法:pair<T1, T2> P;

·含义:表示P有两个类型,类型T1与类型T2

[默认初始化] pair< int , string >My_Pair ;

[自己初始化] pair< int , string >My_Pair2(100,"score") ;

[用别的初始化]pair< int , string >My_Pair3(My_Pair4) ;

[或者这样]pair< int , string >My_Pair3=My_Pair4 ;

默认初始化之后用修改P的内容make_pair(a,b) 函数!

pair< int , string > My_Pair ;
My_Pair=make_pair(100,"score") ;
cout << My_Pair.first << endl << My_Pair.second << endl;

T1 T2也可以用结构体或者也是pair类型的进行套娃!

//例子一
pair < pair < int , int > , string > P1(make_pair(11,12),"A");
cout << P1.first.first << " " << P1.first.second << " " << P1.second;
//例子二
struct pt{
    int x;
    int y;
};
int main()
{
    pair < pt , double > P1;
    P1.first.x=1;
    P1.first.y=1;
    P1.second = sqrt(P1.first.x*P1.first.x+P1.first.y*P1.first.y);
    cout << P1.first.x << endl << P1.first.y << endl << P1.second;
    return 0;
}
/*·pair的比较:优先比较first,first相同再比较second
使用> , >= , < , <= , == , != 进行pair的比较操作*/
	pair<int,int>P1(500,20);
	pair<int,int>P2(300,10);
	if(P1>P2)cout << "Something";
举报

相关推荐

0 条评论