前言
今天更新内容主要还是实现数组的变形,在Python中一个函数Reshape的事,在C++耗费了我两个多小时,可能是我C++基础差吧, 怪我大一,大二没好好学
。本次还有一个很重要的内容就是用C++的“new”创建动态数组,在上一篇C++文章中是用的C语言的“malloc”实现数组地址的动态分配,在一个就是用指针来对数组操作,这些很简单的操作,我还要在大三重新认识,惭愧至极,话不多说,直接上代码。
代码
/* 作者:山科_xxin 时间:2017-03-14 23:27:40 功能:数组变形,求数组极值及其下标 类别:C++数组练习 */ #include<iostream> #include<stdlib.h> #include<ctime> using namespace std; int **random(int n,int m) { int t; int **data; t = time(0); srand(t); data=(int **)malloc(n*sizeof(int *)); for (int i=0;i<n;i++) data[i]=(int *)malloc(2*sizeof(int)); for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) { data[i][j] = rand()%100; } } return data; } int visit(int **data,int n,int m) { for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) cout<<data[i][j]<<" "; cout<<endl; } return 0; } int **reshape(int **data,int n,int m,int x,int y ) { int k = 0; int *midata = new int[n*m]; int **redata = new int *[x]; if (n*m!=x*y) cout<<"reshap失败,非法输入"; else { for( int i=0; i<x; i++ ) { redata[i] = new int[y] ; } int redata1[3][2]; for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) { k++; *(midata+k) = data[i][j]; } } int k1 = 0; /* for(int i = 0;i<n*m;i++) { k1++; cout<<*(midata+k1)<<" "; //cout<<midata[k1]<<" "; } cout<<endl; */ int k2 = 0; for(int ii = 0;ii<x;ii++) { for(int jj = 0;jj<y;jj++) { //cout<<midata[ii*y+jj+1]<<" "; //redata[ii][jj] = midata[ii*y+jj+1]; //cout<<redata[ii][jj]; redata[ii][jj] = midata[ii*y+jj+1]; //cout<<redata[ii][jj]<<" "; } //cout<<endl; } } for(int i = 0; i < x; i++) return redata; } int *Max(int **data,int n,int m) { int maxv = -999; int maxi = 0,maxj = 0; int *max = new int[3]; for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) { if (data[i][j]>=maxv) { maxv = data[i][j]; maxi = i; maxj = j; } } } *max = maxv; *(max+1) = maxi; *(max+2) = maxj; return max; } int *Min(int **data,int n,int m) { int minv = 999; int mini = 0,minj = 0; int *min = new int[3]; for(int i = 0;i<n;i++) { for(int j = 0;j<m;j++) { if (data[i][j]<=minv) { minv = data[i][j]; mini = i; minj = j; } } } *min = minv; *(min+1) = mini; *(min+2) = minj; return min; } int main() { int n,m,x,y; int maxv,minv; cout<<"请输入行数,列数"<<endl; cin>>n; cin>>m; int *min; int *max; cin>>x; cin>>y; int **data = random(n,m); int **redata = reshape(data,n,m,x,y); cout<<"原始数组"<<endl; visit(data,n,m); cout<<"变形后"<<endl; visit(redata,x,y); min = Min(data,n,m); max = Max(data,n,m); cout<<"min:"<<min[0]<<" "<<"i:"<<min[1]<<" "<<"j:"<<min[2]<<endl; cout<<"max:"<<max[0]<<" "<<"i:"<<max[1]<<" "<<"j:"<<max[2]<<endl; system("pause"); return 0; }
演示


注:生成3*6的随机数组,变形为9*2数组,求原数组的最大值,最小值,并返回其坐标。
后语
用C++写一个图像处理算法,肯定是一个庞大的工程,用解释性语言,比如Python,能轻松处理数组,使你更专注于算法的实现,但是C语言速度更快,比如说C语言0.001s完成的任务,Python可能需要0.1s,但是你基本察觉不出来,并且C++还有编译的过程,而Python直接运行。