0
連續地分配我想有以定義在C堆一般多維數組++的能力,並且我想分配連續的存儲到所述陣列用於快速訪問的元素,(而不是鋸齒狀向量)。這是我實現多維數組的實現在存儲器
#include <iostream>
#include <vector>
#include <stdexcept>
using namespace std;
typedef vector<unsigned int> VUI;
class Invalid_MDArray : public exception{
public:
char* what(){
return "Array cannot be constructed ";
}
};
template <class T>
class MArray{
private:
VUI dsize;
VUI cumsize;
T* p;
unsigned int stot;
public:
unsigned int size(){ return stot; }
unsigned int size(unsigned int i) { return dsize[i]; }
MArray(const VUI& a){
stot = 1;
for (unsigned int i = 0; i<a.size(); i++){
if (a[i] == 0) {
Invalid_MDArray o;
throw o;
}
stot = stot*a[i];
dsize.push_back(a[i]);
cumsize.push_back(stot);
}
dsize.push_back(stot);
p = new T[stot];
}
~MArray(){
delete[] p;
}
inline T& operator()(VUI&& a){
if (a.size() != dsize.size() - 1) {
out_of_range o("Index is out of bound!");
throw o;
}
unsigned int i = 0;
while (i<a.size()){
if (a[i]>dsize[i] - 1) {
out_of_range o("Index is out of bound!");
throw o;
}
i++;
}
unsigned int index = 0;
// index=i+imax*j+imax*jmax*k
i = 0;
while (i<a.size()){
if (i == 0) {
index = a[i];
}
else {
index = index + a[i] * cumsize[i - 1];
}
i++;
}
return p[index];
}
};
int main(){
try{
MArray<int> t({ 2, 2, 2 });
t({ 1, 1, 1 }) = 10;
cout << t({ 1, 1, 1 }) << endl;
// I prefer accessing the elements like this -> cout<<t(1,1,1)<<endl;
MArray<int> tt({ 2, 0, 2 }); // OOPS! cannot construct this array!
cout << t.size()<<endl;
t({ 1, 2, 1 }) = 1000; //OOPS! outofbound exception!
}
catch (exception &e){
cout << e.what() << endl;
}
getchar();
}
不過,我不喜歡的界面來訪問陣列,例如
cout << t({ 1, 1, 1 }) << endl;
長相醜陋。
是否有可能實現這個不同有更自然的方式,以更好地元素訪問,像cout<<t(1,1,1);
,而不是?
運算符()不是一個解決方案,因爲你必須定義一個維度的每個號碼,和多維數組的整點是,用戶可以在運行時指定尺寸的自定義數字。 – KjMag
@KjMag你是對的。我從我的答案中刪除了這個。 –