0%

C++小知识点整理

保留固定位有效小数

1
2
3
4
5
6
7
8
#include<iostream>
#include<iomanip> //关键头文件
using namespace std;
int main()
{
cout<<fixed<<setprecision(3)<<1/3.0<<endl;
return 0;
}

这里setprecision的括号里是保留几位有效小数,后面是三分之一,需要注意的是这里必须有一个整数带 .0 否则算出来为0

一般会四舍五入,但有时候也会不执行,具体我也不知道啥原因

1
2
3
4
5
6
7
8
9
10
11
#include<iostream>
#include<iomanip> //关键头文件
using namespace std;
int main()
{
cout<<fixed<<setprecision(3)<<4.5535<<endl;//这样不会
cout<<fixed<<setprecision(3)<<4.55350<<endl;//这样不会
cout<<fixed<<setprecision(3)<<4.55351<<endl;//这样会

return 0;
}

随机数的生成

1
2
3
4
5
6
7
8
9
10
11
12
13
#include<iostream>
#include<cstdlib> //关键头文件
#include<ctime> //生成随机种子的关键头文件
using namespace std;
int main()
{
srand(time(0));
cout<<rand()<<endl;
cout<<rand()%10<<endl;//随机生成0-9的实数
cout<<rand()%11<<endl;//随机生成0-10的实数
cout<<rand()%10+2<<endl;//随机生成2-11的实数
return 0;
}

这里的头文件可以写cstdlib也可以写stdlib.h二者无太大区别ctime和time.h也是如此

array头文件的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<iostream>
#include<array>//关键函数
using namespace std;

void show(array<int,3> a);
/*特别需要注意的是,在定义函数时,括号里传入的值不能
是int a[],而应该是array<int,3> a这样函数才能够使用
*/
int main()
{
array<int,3> a;
for(int i=0;i<a.size();i++)
{
a[i]=rand();
}
show(a);
return 0;
}

void show(array<int,3> a)
{
for(int i=0;i< a.size();i++)
{
cout<<a[i]<<endl;
}
}
1
array<array<int,2>,3> a//这表示3行2列矩阵

这个函数库再有就是可以整体赋值和交换矩阵以及输出矩阵元素个数

1
2
3
4
a.fill(3)//表示把a中的元素都赋值为3
array<int,4> a={5}//把a中的四个整型元素都赋值为5
a.swap(b)//a b交换,这里的a b元素个数必须相同
cout<<a.size()//输出a的元素个数

vector头文件的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<vector>
using namespace std;
//vector: <vector>, 变长数组
//常用操作:整体赋值,size(),push_back(),pop_back(),resize()
void showVector(vector<int> v)
{
for(int i = 0; i < v.size(); i++)
{
cout << v[i] << " ";
}
cout << endl;
}

int main()
{
vector<int> a;
cout << "At the beginning, a.size() = " << a.size() << endl;

for(int i = 1; i <= 10; i++)
{
a.push_back(i*2);
cout << "After i = " << i << " , a.size() = " << a.size() << endl;
}

showVector(a);

for(int i = 1; i <= 5; i++)
{
a.pop_back();
cout << "After i = " << i << " , a.size() = " << a.size() << endl;
}

showVector(a);

a.resize(10);
cout << "After a.resize(10): " << endl;
showVector(a);

a.resize(3);
cout << "After a.resize(3): " << endl;
showVector(a);

return 0;
}

C++中的iomanip的使用

I/O流常用控制符:

使用控制符时,在程序开头加投文件#include <iomanip> C++有两种方法控制格式输出:

1、用格式控制符;

2、用流对象的成员函数 格式控制符:

下面是iomanip的部分用法指令

:以下指令前面都要加cout<<

指令 功能
dec 以十进制形式输出
hex 以十六进制形式输出
oct 以八进制形式输出
setfill(‘*’) 用*填充空余部分
setprecision(n) 设置显示n位小数(四舍五入)
setw(n) 设置域宽为n个字符,并默认右对齐
fixed 固定小数显示位,只有超出setprecision显示范围时才使用
scientific 科学计数法显示,默认保留小数点后6位
left 左对齐
right 右对齐
skipws 忽略前导空白
uppercase 16进制数大写输出
lowercase 16进制数小写输出

浮点数精度:默认精度为6,可以通过setprecision()来设置新的浮点数精度
非定点数模式:从左侧第一个非零数值开始的连续有效数字个数
定点数模式:小数点后连续有效数字个数
取消设置/回复默认:cout.unsetf(控制符)

setw(): 设置显示宽度 (单次/一次性操作,仅仅对后面的第一个对象有效)
其他的格式控制符:大都是黏性操作(持久性/永久性操作,设置之后持续有效,直到新的设置为止)

递归的简单使用

利用递归算阶乘

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include<iostream>
using namespace std;
int s(int a)
{
if(a>1)
{
int b=a*s(a-1);
return b;
}
}
int main()
{
cout<<s(4);
return 0;
}

法2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
using namespace std;
int s(int a)
{
if(a==1)
return a;
else
{
return a*s(a-1);
}

}
int main()
{
cout<<s(4);
return 0;
}

递归总会有if判断语句

几种常见的排序

冒泡排序

首先通过下图简单了解一下冒泡排序的实现方式

在这里插入图片描述

逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;

int main() {

int arr[6] = { 0 };
int len = sizeof(arr) / sizeof(int);

for (int i = 0; i < len; i++) {
cin >> arr[i];
}

// write your code here......
int m;
for(int i=0;i<len;i++)//循环len次,每一次找到至少一个数字的正确位置(从右向左)。
{
for(int j=0;j<len-1-i;j++)//循环len-(i+1)次,也就是减去(已排好的数个数+1)
{
if(arr[j]>arr[j+1])
{
m=arr[j+1];
arr[j+1]=arr[j];
arr[j]=m;
}
}
}
for(int i=0;i<len;i++)
{
cout<<arr[i]<<" ";
}

return 0;
}

选择排序

实现方式如下图

在这里插入图片描述

这个逻辑就比较简单了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
using namespace std;

int main() {

int arr[6] = { 0 };
int len = sizeof(arr) / sizeof(int);

for (int i = 0; i < len; i++) {
cin >> arr[i];
}

// write your code here......
int m;
for(int i=0;i<len;i++)//循环len次,每一次找到一个数字的正确位置(从左往右)
{
for(int j=i+1;j<len;j++)//从第i+1个数开始比较,从而减少循环次数
{
if(arr[i]>arr[j])
{
m=arr[i];
arr[i]=arr[j];
arr[j]=m;
}
}
}
for(int i=0;i<len;i++)
{
cout<<arr[i]<<" ";
}

return 0;
}

快速排序

每次至少将一个基数复位,逻辑上有点东西,多用多学。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include<iostream>
using namespace std;
int a[101],n;//预留空间
void quicksort(int left,int right)
{
int i,j,temp,t;
if(left>right)//判断参数是否合理
{
return;
}
temp=a[left];//选择基数
i=left;//选择边界
j=right;
while(i!=j)
{
while(a[j]>=temp&&i<j)//挑选合适数据
{
j--;
}
while(a[i]<=temp&&i<j)//挑选合适数据
{
i++;
}
if(i<j)//将满足条件的数据交换
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
a[left]=a[i];//将基数放到合适位置
a[i]=temp;
quicksort(left,i-1);//递归二分法
quicksort(i+1,right);
return;
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)//此处令i=0,i<n也可以,下面则是quicksort(0,n-1) 打印也必须是从i=0开始
{
cin>>a[i];
}
quicksort(1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}

创建动态数组

利用指针(一般仅用于创建一维数组)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
using namespace std;

int main() {

int n;
cin >> n;

// write your code here......
int *p=new int[n];//创建一维数组,元素个数为n
for(int i=0;i<n;i++)
{
p[i]=i+n;
cout<<p[i]<<" ";
}
delete[] p;
return 0;
}

利用vector

vector创建一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <vector>
using namespace std;

int main() {

int n;
cin >> n;
// write your code here......
vector<int> p(n);//创建一维数组,元素个数为n
vector<vector>
for(int i=0;i<n;i++)
{
cin>>p[i];
cout<<p[i]+n<<" ";
}
return 0;
}

vector创建二维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n,m;
cin >> m >>n;
vector<int> w(n,1);//先搞一个一维数组,将n个元素值设为1
vector<vector<int>>p(m,w);//m行n列
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
//cin>>p[i][j];
}
}
for(int i=0;i<m;i++)
{
for(int j=0;j<n;j++)
{
cout<<p[i][j]<<"\t";
}
cout<<endl;
}//结果输出m行n列的1
return 0;
}