文章目录
这学期在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;
}
非常感谢看到这里,如果有帮助到你的话可以点个👍支持一下噢!