C++ 請擅用 vector。

 

1. 一維陣列

 1-1. 配置

 

#define N 10

/* Allocate N integer */
int *a = (int*)malloc(sizeof(int)*N);
if(a==NULL) printf("malloc fail.\n");

/* Allocate N double */
double *b = (double*)malloc(sizeof(double)*N);
if(b==NULL) printf("malloc fail.\n");

 

1-2. 釋放

free(a);
free(b);

 

2. 二維陣列

2-1. 低效能配置、釋放

 

#define M 10
#define N 5
/* int A[M][N] */

/* 配置 */
int **A = (int**)malloc(sizeof(int*)*M);
for(int i=0; i!=M; ++i)
   A[i] = (int*)malloc(sizeof(int)*N);

/* 釋放 */
for(int i=0; i!=M; ++i) free(A[i]);
free(A);

 

2-2 較佳方式

#define M 10
#define N 5

/* 配置時 */
int **A  = (int**)malloc(sizeof(int*)*M);
int *tmp = (int*) malloc(sizeof(int)*M*N);
for(int i=0; i!=M; ++i, tmp+=N)
   A[i] = tmp;

/* 清空時 */
memset(*A, 0, sizeof(int)*M*N);

/* 釋放時 */
free(*A);
free(A);

 

2-3 包成副函式

/* 副函式 */
void** malloc2dim(unsigned x, unsigned y, unsigned element_size)
{
    void** p  = (void**)malloc(sizeof(void*)*x);
    char* tmp = (char*)malloc(element_size*x*y);
    for(unsigned i=0; i!=x; ++i) {
       p[i] = tmp;
       tmp += (element_size*y);
    }
    return p;
}

/* 調用 */
#define M 10
#define N 5
int **A = (int**)malloc2dim(M, N, sizeof(int));

/* 釋放 */
free(*A);
free(A);

 

2-4 一維取代多維

 會大量調用 function / malloc,維護性較差,此處不予示範。

 

3. Array Index Management

這在某本原文數值分析之書上有看到,沒看過 function body 長得如何,推測應與下類似,但這方法所藏之危機確實不少,唯可能為筆者不願初學者在學數值分析時,被記憶體配置問題所困擾,故寫了份較為方便調用之方式。 假設生成一陣列,欲存取的是 a[10..20],這裡的 10 給予變數叫 start, 20 給予變數叫 end, 直接來看範例

#include <stdio.h>
int *ivector(int start, int end)
{
    int *x = (int*)malloc(sizeof(int)*(end-start-1));
    return x-start;
}

void free_ivector(int *x, int start, int end)
{
    free(x+start);
}
int main()
{
    int start=5, end=10, i, cnt=0;
    int *ivec = ivector(start, end);
    for(i=start; i<=end; ++i) ivec[i]=++cnt;
    for(i=start; i<=end; ++i) printf("ivec[%d]=%d\n", i,ivec[i]);
    free_ivector(ivec, start, end);
    return 0;
}

 

二維的話也類似做法

 

#include <stdio.h>

/*
 * sx: start x
 * ex: end   x
 * sy: start y
 * ey: end   y
 *
 */

int **imatrix(int sx, int ex, int sy, int ey)
{
    int i, j;
    int **x = (int**)malloc(sizeof(int*)*(ex-sx+1));
    x-=sx;
    for(i=sx; i<=ex; ++i){
        x[i]=(int*)malloc(sizeof(int)*(ey-sy+1));
        x[i]-=sy;
    }
    return x;
}

void free_imatrix(int **x, int sx, int ex, int sy, int ey)
{
    int i;
    for(i=sx; i<=ex; ++i) free(x[i]+sy);
    free(x+sx);
}

int main()
{
    int i, j, cnt=0;
    int sx=-1, ex=+2, sy=1000, ey=1005;
    int **mat = imatrix(sx, ex, sy, ey);
    for(i=sx; i<=ex; ++i)
        for(j=sy; j<=ey; ++j)
            mat[i][j]=++cnt;

    for(i=sx; i<=ex; ++i)
        for(j=sy; j<=ey; ++j)
            printf("mat[%d][%d]=%d\n", i, j, mat[i][j]);
    free_imatrix(mat, sx, ex, sy, ey);    
    return 0;
}

 

這種設計模式我想是針對,對 array index 並不熟的人而使用的,仔細探討,隱藏的問題應可挖出不少出來,做為一思考,於此停筆。

arrow
arrow
    全站熱搜

    edisonx 發表在 痞客邦 留言(0) 人氣()