C++常用小Tips总结(不定期更新)

这学期在C++的上机做题过程中遇到过很多小坑,都是一些细节上的东西。所以打算专门把它们总结起来,防止以后遇到类似的问题一下子懵了,也当作是期末复习。

1. sort内置排序函数的使用

1.常见类型的数组,如int,double,float,string类型,如果要进行sort排序,直接调用sort函数即可(需要包含algorithm头文件),第一个参数为数组名,第二个参数为数组名+数组长度,需要注意的是,sort函数默认是升序排序,如果是降序排序,需要另外加上第三个参数 greater<数组类型>()。下面拿int类型的数组举个例子:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int a[10];	//创建长度为10的数组a
	
	//为数组a赋值
	for(int i=0;i<10;i++)
		a[i]=i;
	
	//nt类型数组a进行降序排序
	sort(a,a+10,greater<int>());	
	
	for(int i=0;i<10;i++)	
		cout << a[i] << " ";
	//输出结果为 9 8 7 6 5 4 3 2 1 0,完成降序排序
	return 0;
}

2.对于自定义类或结构体的排序,如果要使用sort函数,要自定义元素的排序规则。下面拿日子排序的例子进行说明。
首先我们有一个日子的结构体,里面有三个参数,年,日。现在我们希望输入t个日期(t>=2),然后进行排序,并且输出第二大的出生日期。

#include <iostream>
#include<algorithm>
using namespace std;

struct Date{    
int year,month,day;
};

bool cmp(Date x, Date y)
{    
	if(x.year != y.year)		 //先比较年
		return x.year < y.year;  //表示年份越小年纪越大    
	else if(x.month != y.month)	 //再比较月 
		return x.month < y.month;//表示月份越小年纪越大    
	else        			 //最后比较日
		return x.day < y.day;	 //表示日子越小年纪越大
	}
	
	

int main()
{    
	int t;    
	cin >> t;    			 //输入日期个数t
	Date *A = new Date[t];    	 //定义结构体数组
	for(int i = 0;i < t; i++){       //输入每一个日期的年月日
		cin >> A[i].year >> A[i].month >> A[i].day;    
	}    
	sort(A,A+t,cmp);		 //对t个日期进行排序	    
	
	//输出第二大的日期
	cout << A[1].year << "-" << A[1].month << "-" << A[1].day << endl;   
	return 0;
}

/*
//输入比较个数,以及每个出生日期,下面为输入案例
6 
1980 5 6 
1981 8 3 
1980 3 19 
1980 5 3 
1983 9 12 
1981 11 23

//输出第二老的日期: 1980-5-3
*/

3.对于自定义类,如果要通过重载运算符"<"的方式对类使用sort排序,需要注意的是需要将重载函数声明为const函数。我在另一篇文章“戳一下”对这种情况进行了详细的讲解,这里就省略了。


2. 固定输出小数点后几位(fixed与setprecision的使用)

比如我们需要对一个浮点数进行小数点后四位的输出,则需要在输出该元素前加上下面的规则:

fixed << setprecision(4) 

需要注意的四点

  • 该规则包含在#include < iomanip >头文件里面,使用前需要加上。
  • 该规则对double和float类型的数据适用,对int类型的数据不适用
  • 该规则使用一次永久生效,也就是说使用之后所有double和float类型的输出均受该规则
  • setprecision里面填写的是小数点输出的位数,下面的例子是输出四位,所以里面填4

下面举个例子进行说明:

#include<iostream>
#include <iomanip>   //必须包含该头文件,否则出错
using namespace std;
int main()
{
	 double a=3.5;
	 int b = 4;
	 //默认输出
	 cout << "默认输出: a = " << a << "  b = " << b << endl;
	 
	 //加入规则,可发现int类型的数据不会输出小数点
	 cout << "加入小数点规则后输出:" << fixed << setprecision(4) <<  "a = " << a << "  b = " << b << endl;
	
	 //再次默认输出,此时规则仍然适用
	 cout << "再次默认输出:a = " << a << "  b = " << b << endl; 
	 return 0; 
	
/*
//输出如下:
默认输出: a = 3.5  b = 4
加入小数点规则后输出:a = 3.5000  b = 4
再次默认输出:a = 3.5000  b = 4
*/
 } 

在这里插入图片描述


3. 输出两位数字,不够则前面补零(setw与setfill的使用)

对于一些时间的输出题目,有时候规定输出格式如下:“19:05:08”,像这里原本的时分秒分别为19,5,8,但是对于分跟秒这种单位数的,我们需要在前面补0,这时候就需要用到下面的规则

setw(2) << setfill('0')

需要注意的三点

  • 该规则包含在#include < iomanip >头文件里面,使用前需要加上。
  • 该规则只适用于紧接着的输出,使用一次后则失效。
  • 对于要补充的字符,需要打上单引号,如补0则setfill(‘0’),补#则setfill(’#’)

拿19:05:08举例子:

#include<iostream>
#include <iomanip>
using namespace std;
int main()
{ 
	 int hour=19,minute=5,second=8;
	 cout << setw(2) << setfill('0') << hour << ":" <<   \
	         setw(2) << setfill('0') << minute << ":" << \
	         setw(2) << setfill('0') << second << endl;
	 return 0; 
} 

在这里插入图片描述


4. string字符串遇到的坑

数字转字符串

  • 不能直接用索引的方法,刚开始要用+=的方法才行,因为初始的时候string里面是空的,如果直接用下标的形式进行访问则会出错。
  • 使用int变量代表的数字加上 '0’转换为char类型的字符(可以在前面加上char也可以不加),若不加‘0’,则表示的是ASCII码中2代表的值,而不是真正的字符‘2’。

错误写法示例(初始化的string变量不能够用下标直接访问)

#include<iostream>
#include <string>
using namespace std;
int main()
{ 
   int a = 2;
   string B;
   B[0] = a+'0';    //!!!不能直接用下标形式访问,因为开始的时候B的长度为0
   cout << B << endl;
   return 0; 
} 

用dev环境运行出来是空的
在这里插入图片描述

正确写法示例(使用string变量+=的方式填入新数据)

#include<iostream>
#include <string>
using namespace std;
int main()
{ 
   int a = 2;
   string B;
   B += a+'0';    //修改成+=的方式
   // B += char(a+'0');  另一种写法,也可以加个char类型转换,加不加都行
   cout << B << endl;
   return 0; 
} 

运行出来可看到数字2转换为字符2
在这里插入图片描述

字符串转数字

  • 同上面类似,如果要将字符串中的数字字符转换成int类型的数字,只需要将对应的字符减去’0’即可
  • 下面举例将字符串”234“转换为单独的2,3,4的int变量。
#include<iostream>
#include <string>
using namespace std;
int main()
{ 
    string A = "234";			//定义字符串“234”
    int a[3];				//定义int类型数组
    for(int i=0;i<A.length();i++){	//依次输出int类型的2,3,4,A.length()表示字符串的长度
         a[i] = A[i]-'0';		//字符串中的字符转换成数字
         cout << a[i] << endl;		//对转换后的数字进行输出
    }
    return 0; 
} 

在这里插入图片描述


非常感谢看到这里,如果有帮助到你的话可以点个👍支持一下噢!

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值