工做小結一

工做小結一

1.1 如何進行C矩陣運算

不少時候咱們使用matlabpythonc++等進行矩陣操做,可是當進行實際操做的時候,咱們得把這些語言使用C去實現。c++

實現起來有兩種方式:git

  • [x] 一級指針

定義方式以下: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
  • [x] 二級指針

定義方式以下:測試

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

1.2 如何提高malloc和free的效率

當咱們使用動態數組二叉樹自建vector等操做的時候,得常常用到mallocfree操做,其實這兩個操做都很費時。code

好比:(1)新建和釋放10000次的int。(2)新建和釋放1個大小爲10000的int內存。這兩個筆者未親自嘗試,猜想前者不比後者快多少(或者更慢)。

  • [ ] 使用C++的vector策略

先申請一塊,不夠就加倍申請

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上的庫(僅供參考,筆者未測試):

C語言版本

C++版本

1.3 C實現深林

  • [ ] 二叉樹
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節所述

1.4 C優雅的函數

舉個例子:

​ 當一系列函數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結構體,把相應的函數指針放入其中便可。

相關文章
相關標籤/搜索