不少時候咱們使用matlab
、python
、c++
等進行矩陣操做,可是當進行實際操做的時候,咱們得把這些語言使用C去實現。c++
實現起來有兩種方式:git
定義方式以下:github
typedef struct Matrix_t { unsigned int rows; unsigned int cols; void* data; //具體實現看我的需求 }Matrix;
新建和釋放方式以下:數組
//Matrix* matrix = (Matrix*)malloc(sizeof(Matrix));//返回返回加入,參數進入不須要 /*Example void CreatMatrix(Matrix* src) { ....; } Matrix* CreatMatrix() { return ...; } */ matrix->data = (void*)malloc(sizeof(void)*rows*cols);
free(matrix->data); //free(matrix);//返回返回加入,參數進入不須要
遍歷方式以下:函數
for (size_t i=0;i<rows;i++) for(size_t j=0;j<cols;j++) data[i*cols+j] = value;//operate
定義方式以下:測試
typedef struct Matrix_t { unsigned int rows; unsigned int cols; void** data; //具體實現看我的需求 }Matrix;
新建和釋放方式以下:指針
//Matrix* matrix = (Matrix*)malloc(sizeof(Matrix));//返回返回加入,參數進入不須要 /*Example void CreatMatrix(Matrix* src) { ....; } Matrix* CreatMatrix() { return ...; } */ matrix->data = (void**)malloc(sizeof(void*)*rows); for(size_t i=0;i<rows;i++) matrix->data[i] = (void*)malloc(sizeof(void)*cols);
for(size_t i=0;i<rows;i++) free(matrix->data[i]); free(matrix->data); //free(matrix);//返回返回加入,參數進入不須要
遍歷方式以下:rest
for (size_t i=0;i<rows;i++) for(size_t j=0;j<cols;j++) data[i][j] = value;//operate
當咱們使用動態數組、二叉樹、自建vector等操做的時候,得常常用到malloc
和free
操做,其實這兩個操做都很費時。code
好比:(1)新建和釋放10000次的int
。(2)新建和釋放1個大小爲10000的int
內存。這兩個筆者未親自嘗試,猜想前者不比後者快多少(或者更慢)。
先申請一塊,不夠就加倍申請
typedef struct Vector_t { unsigned int realNum; //當前使用數量 unsigned int TotalNum; //申請內存容量 void* data; }Vector;
if(realNum >= TotalNum-2)//保留兩個預留位 { void* tmp = (void*)malloc(sizeof(void)*Vector->TotalNum*2.0);//不夠就擴大兩倍 for(size_t i=0;i<Vector->realNum;i++) tmp[i] = Vector->data[i];//複製以前數據 free(Vector->data);//釋放以前數據 Vector->data = tmp;//指向新的數據 }
直接申請一大塊內存,以後申請的空間所有在內存池以內
筆者沒有親自實現過內存池代碼,只是使用別人已經寫好的庫(公司大神寫的)
如下是Github上的庫(僅供參考,筆者未測試):
typedef struct TreeNode_t//節點 { void data; //data struct storage void* children; void* parent; }TreeNode;
typedef struct TreeNode_t//一棵樹 { unsigned int realNum; //當前使用數量 unsigned int TotalNum; //申請內存容量 TreeNode* treeNode; }TreeNode;
typedef struct Forest_t//一片深林 { unsigned int realNum; //當前使用數量 unsigned int TotalNum; //申請內存容量 TreeNode** treeNode; }Forest;
創建和釋放方法參考1.1節所述,可變長度方法參考1.2節所述
舉個例子:
當一系列函數A一、A二、A3.....是爲完成某一個項目的,另一系列函數B一、B二、B3.....是爲完成某一個項目的。固然你能夠直接定義,經過名字取區分。。。
如何優雅的解決這個問題?
結構體中存放函數指針!!!
#include<stdio.h> #include<malloc.h> struct Hello{ void (*sayHello)(char* name); }; void sayHello(char* name){ printf("你好,%s\n",name); } int main(){ //struct Hello* hello=(struct Hello *)malloc(sizeof(struct Hello)); //hello->sayHello=sayHello; //hello->sayHello("a"); struct Hello hello= {sayHello}; hello.sayHello("a"); return 0; }
那麼咱們就能夠創建兩個A和B結構體,把相應的函數指針放入其中便可。