C++应用#
随机数生成#
传统C方法:
1#include<cstdlib>
2#include<ctime>
3//初始化随机种子(只需一次)
4srand(time(0));
5int random_num = rand();
6int random_inrange = rand()%100;//0-99
7int random_inrange = rand()%100+1//1-100
8//随机质量不怎么高,易预测,不均匀
现代C++方法:
1#include<random>关于std::#
由于平时写算法题都用头文件:
#include<bits/stdc++.h>+using namespace std;
容易忽略了std::的使用;
1std::工具名-->使用std仓库的某个工具
2using namespace std-->默认从std使用工具
3//实际工作时,不推荐使用上述头文件
4//输入输出,字符串string,容器,算法函数等都需要加std::
5std::cout<<"minecraft";
6std::endl;
7std::vector<int> a;std::map<std::string,int> mp;
8std::string s = "hello";
9std::sort(a,a+n);
10std::swap(a,b);
11std::max(x,y);std::min(x,y);也可以只引入常用的几个:
1using std::cout;
2using std::cin;
3using std::vector;
4using std::endl;
5//其他仍要加上std::
矩阵乘法优化#
1int n,m,s;
2cin>>n>>m>>s;//表示是n*m与m*s的矩阵相乘
3//原始数学算法
4for(int i = 0;i<n;i++){
5 for(int j = 0;j<s;j++){
6 for(int k = 0;k<m;k++){
7 c[i][j] += a[i][k]*b[k][j];
8 }
9 }
10}
11fill(c.begin(),c.end(),vector<int>(s,0));
12//下面是效率更高的算法,先当黑盒用
13for(int i = 0;i<n;i++){
14 for(int k = 0;k<m;k++){
15 for(int j = 0;j<s;j++){
16 c[i][j] += a[i][k]*b[k][j];
17 }
18 }
19}
20//其实就是把基础版本的后两个for循环换了一下位置。
new/delete动态内存#
相比C的malloc函数更加安全可用一些;
用于申请动态内存,创建变量
1//单变量创建
2int *p = new int;
3*p = 10;//赋值
4delete p;//释放内存method1
5
6//数组变量创建
7int size;
8cin>>size;//用户输入数组大小
9int *arr = new int[size];//动态分配
10for(int i = 0;i<size;i++){
11 arr[i] = i;//赋值
12 //或者*(arr+i) = i;
13}
14delete[] arr;//释放内存method2
15
16//二维数组
17int *arr = new int[row*col];
18
19//其他写法
20int *p = new int();//初始化为0
21int *p = new int(1);//初始化为1
22int *arr = new int[5]();//初始化全为0
23int *arr = new int[5]{1,2,3};//前三个初始化,后两个为0
vector底层指针数组#
虽然已经会用vector<>这种自动化的工具,但是:
int **mat和int *mat也是要掌握的 ;
以便了解vector<>的底层原理;
1//传统方法
2int row,col;
3cin>>row>>col;//输入矩阵大小
4int **mat = new int*[row];//每个mat元素指向一个int*的指针
5for(int i = 0;i<row;i++){
6 mat[i] = new int[col];//每个mat[i]指向一个int的数组
7}
8for(int i = 0;i<row;i++){
9 for(int j = 0;j<col;j++){
10 mat[i][j] = i*col+j;//赋值就是老方法
11 }
12}
13for(int i = 0;i<row;i++){
14 delete[] mat[i];//先释放每一行
15}
16delete[] mat;//再释放行指针数组
解引用:
mat[i][j]=*(*(mat+i)+j)

应用场景:
1//创建不规则稀疏矩阵
2int **jagged = new int*[3];
3jagged[0] = new int[2]{1,2};
4jagged[1] = new int[3]{3,4,5};
5jagged[2] = new int[1]{6};
6//频繁交换行
7void row_swap(int **mat,int row1,int row2){
8 int *tmp = mamt[row1];
9 mat[row1] = mat[row2];
10 mat[row2] = tmp;
11}
12//...
1//内存连续存储方法
2//性能更高
3int row = 3;int col = 4;
4int *mat = new int[row*col];
5for(int i = 0;i<row;i++){
6 for(int j = 0;j<col;j++){
7 mat[i*col+j] = i*col+j;//赋值
8 }
9}
10delete[] mat;//释放内存

