跳过正文
  1. 学习笔记/
  2. Language/
  3. C++ Algorithm/
  4. C++ · 其他/

·2 分钟·
lyrumu
作者
lyrumu
目录

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 **matint *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;//释放内存

指针数组2