生活随笔
收集整理的這篇文章主要介紹了
n维数组实现(可变参数表的使用)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先先介紹一下可變參數表需要用到的宏:
頭文件:#include<cstdarg>
void va_start( va_list arg_ptr, prev_param );?
type va_arg( va_list arg_ptr, type );?
void va_end( va_list arg_ptr );
?
va_list:用來保存宏va_start、va_arg和va_end所需信息的一種類型。為了訪問變長參數列表中的參數,必須聲明
???????????? va_list類型的一個對象?????? 定義:?typedef char *? va_list;
va_start:訪問變長參數列表中的參數之前使用的宏,它初始化用va_list聲明的對象,初始化結果供宏va_arg和
?????????????? va_end使用;
va_arg:?展開成一個表達式的宏,該表達式具有變長參數列表中下一個參數的值和類型。每次調用va_arg都會修改
????????????? 用va_list聲明的對象,從而使該對象指向參數列表中的下一個參數;
va_end:該宏使程序能夠從變長參數列表用宏va_start引用的函數中正常返回。
va在這里是variable-argument(可變參數)的意思.?
這些宏定義在stdarg.h中,所以用到可變參數的程序應該包含這個頭文件.下面我們寫一個簡單的可變參數的函數,改函數至少有一個整數參數,第二個參數也是整數,是可選的.函數只是打印這兩個參數的值.
/*C++中好像不區分內部類與嵌套類兩個名詞。內部類與嵌套類都是指在類中定義類。局部類是指在函數中定義類。(c++不能在函數中定義函數。c++在類中定義的函數也就是成員函數。)(c++內部類與java內部類最大的區別就是:c++的內部類對象沒有外部類對象的指針,不能訪問外部類對象的非靜態成員;java的非靜態內部類對象有外部類對象的指針,能訪問外部類對象的非靜態成員。)
*/
#include<cstdarg>
//標準頭文件,提供宏va_start, va_arg, 和 va_end
#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<
string>
#include<cstring>
#define MAX_ARRAY_DIM 8
//假設數組的維數的最大值為8
using namespace std;template <typename ElemType>
class MyArray{private:public:class Array{public:ElemType *
base;
//數組元素的基址 int dim;
//數組的維數int * bounds;
//數組維界基址int * constants;
//數組映像函數常量基址
};static const int ERROR = -
1;static const int OK =
1;int InitArray(Array &A,
int dim, ...);
//若維數dim和隨后的各維的長度合法,則構造相應的數組A int DestoryArray(Array &A);
//銷毀數組A int Value(Array A, ElemType &e, ...);
//A是n為數組,e為元素變量,隨后是n個下標值,將下標值對應的元素賦給e int Assign(Array &A, ElemType e, ...);
//將元素e賦給指定的下標值int Locate(Array A, va_list ap,
int &off);
//返回指定的下標值對應的偏移地址, 存放在off
};template <typename ElemType>
int MyArray<ElemType>::InitArray(Array &A,
int dim, ...){if(dim<
1 || dim > MAX_ARRAY_DIM)
return MyArray::ERROR;A.dim =
dim;A.bounds = (
int *)
malloc(dim *
sizeof(
int));if(!A.bounds)
return MyArray::ERROR;int elemtotal =
1;va_list ap;va_start(ap, dim);//獲取存放變長參數信息的數組 for(
int i=
0; i<dim; ++
i){A.bounds[i] = va_arg(ap,
int);if(A.bounds[i] <
0)
return MyArray::ERROR;elemtotal *=
A.bounds[i];}va_end(ap);A.base = (ElemType *)
malloc(elemtotal *
sizeof(ElemType));if(!A.
base)
return MyArray::ERROR;A.constants = (
int *)
malloc(dim *
sizeof(
int));if(!A.constants)
return MyArray::ERROR;//開始求映像數組//int L = sizeof(ElemType);//每一個元素的大小int L =
1;
//注意這里的元素的單位大小就是 1, 因為 A.base + off 實際上是 A.base+off*sizeof(ElemType);A.constants[dim-
1] =
L; for(
int i=dim-
2; i>=
0; --
i)A.constants[i] = A.bounds[i+
1] * A.constants[i+
1];return MyArray::OK;
}template <typename ElemType>
int MyArray<ElemType>::DestoryArray(Array &
A){if(!A.
base)
return MyArray::ERROR;free(A.
base);if(!A.bounds)
return MyArray::ERROR;free(A.bounds);if(!A.constants)
return MyArray::ERROR;free(A.constants);
}
template <typename ElemType>
int MyArray<ElemType>::Value(Array A, ElemType &
e, ...){va_list ap;int off;va_start(ap, e);if(Locate(A, ap, off)==MyArray::ERROR)
return MyArray::ERROR;e = *(A.
base+
off);va_end(ap);return MyArray::OK;
}template <typename ElemType>
int MyArray<ElemType>::Assign(Array &
A, ElemType e, ...){va_list ap;int off;va_start(ap, e);if(Locate(A, ap, off)==MyArray::ERROR)
return MyArray::ERROR;*(A.
base+off) =
e;va_end(ap);return MyArray::OK;
}template <typename ElemType>
int MyArray<ElemType>::Locate(Array A, va_list ap,
int &
off){off =
0;for(
int i=
0; i<A.dim; ++
i){int ind = va_arg(ap,
int);if(ind<
0 || ind >= A.bounds[i])
return MyArray::ERROR;off += A.constants[i]*
ind;}return MyArray::OK;
}class Student{public:char *
name; int age;Student(){}Student(char *name,
int age){this->name =
name;this->age =
age; }void outMsg(){cout<<
"姓名: " << name <<
", 年齡: " <<
age;}
};int main(){MyArray<
int>
testArray;MyArray<
int>
::Array A;testArray.InitArray(A, 4,
1,
2,
3,
4);for(
int i=
0; i<
1; ++
i)for(
int j=
0; j<
2; ++
j)for(
int k=
0; k<
3; ++
k)for(
int n=
0; n<
4; ++
n){int e = i+j+k+
n;testArray.Assign(A, e, i, j, k, n);}for(
int i=
0; i<
1; ++
i)for(
int j=
0; j<
2; ++
j)for(
int k=
0; k<
3; ++
k)for(
int n=
0; n<
4; ++
n){int e;testArray.Value(A, e, i, j, k, n);printf("%d\n", e);}MyArray<Student>
testArrayx;MyArray<Student>
::Array Ax;testArrayx.InitArray(Ax, 3,
4,
10,
20);
//4, 10, 20分別表示六層, 座位行號, 座位列號 Student s(
"hjzgg",
23);testArrayx.Assign(Ax, s, 1,
2,
3);s.name =
"lxkdd"; testArrayx.Value(Ax, s, 1,
2,
3);s.outMsg();return 0;
} ?
轉載于:https://www.cnblogs.com/hujunzheng/p/4639440.html
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的n维数组实现(可变参数表的使用)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。