Реализация многомерного массива, смежно размещенного в памяти

Я хочу иметь возможность определять общий многомерный массив в куче в 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);вместо?

0

Решение

Я бы не стал изобретать велосипед. Быстрый поиск Google показал Boost.MultiArray, библиотека многомерных массивов, которая, кажется, соответствует всем вашим требованиям к дизайну.

Я также спросил бы, является ли это преждевременной оптимизацией. Ты серьезно необходимость больше скорости здесь? Векторы действительно быстрые.

0

Другие решения

Других решений пока нет …