Я хочу иметь возможность определять общий многомерный массив в куче в 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);
вместо?
Я бы не стал изобретать велосипед. Быстрый поиск Google показал Boost.MultiArray, библиотека многомерных массивов, которая, кажется, соответствует всем вашим требованиям к дизайну.
Я также спросил бы, является ли это преждевременной оптимизацией. Ты серьезно необходимость больше скорости здесь? Векторы действительно быстрые.
Других решений пока нет …