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