2013-09-28 20 views
1

我怎么能代表一个三维阵列状如何用地图表示3D数组?

myarray[1000][1000][1000]; 

这是一个大阵赋予超出了内存限制。每个单元都不会被使用,所以存在巨大的内存浪费。我想映射3个数字和值,有没有其他方法可以做到这一点?

+3

'的std ::地图<整型,性病::地图<整型,性病::地图 >>'其中'T'是要保持类型。 –

+4

您可以使用3个整数创建一个结构体,并将其用作地图的关键字。如果你这样做,记得设置*运算符<*函数。 – memo1288

+0

可以使用静态数组内存的动态内存分配 –

回答

3
#include <map> 
#include <iostream> 

struct MapIndex{ 
    int x, y, z; 
    MapIndex() 
    :x(0), y(0), z(0){ 
    } 
    MapIndex(int x_, int y_, int z_) 
    :x(x_), y(y_), z(z_){ 
    } 
}; 

bool operator<(const MapIndex &v1, const MapIndex &v2){ 
    if (v1.z > v2.z) 
     return false; 
    if (v1.z < v2.z) 
     return true; 
    if (v1.y > v2.y) 
     return false; 
    if (v1.y < v2.y) 
     return true; 
    if (v1.x < v2.x) 
     return true; 
    return false; 
} 

template<typename Val> struct Array3D{ 
    typedef std::map<MapIndex, Val> Data; 
    Data data; 
    Val defaultValue; 
    const Val& getValue(int x, int y, int z) const{ 
     MapIndex index(x, y, z); 
     Data::const_iterator found = data.find(index); 
     if (found == data.end()) 
      return defaultValue; 
     return found->second; 
    } 
    void setValue(int x, int y, int z, const Val &val){ 
     data.insert(std::make_pair(MapIndex(x, y, z), val)); 
    } 
    bool hasValue(int x, int y, int z) const{ 
     Data::const_iterator found = data.find(MapIndex(x, y, z)); 
     return found != data.end(); 
    } 
    Array3D(const Val& defaultValue_ = Val()) 
    :defaultValue(defaultValue_){ 
    } 
}; 


int main(int argc, char** argv){ 
    Array3D<int> ints; 
    std::cout << ints.hasValue(0, 1, 2) << std::endl; 
    std::cout << ints.getValue(0, 1, 2) << std::endl; 
    ints.setValue(0, 1, 2, 47); 
    std::cout << ints.hasValue(0, 1, 2) << std::endl; 
    std::cout << ints.getValue(0, 1, 2) << std::endl; 
    return 0; 
} 
+0

非常好的解决方案! –

+0

+1。如果你使用C++ 11,你也可以使用:['std :: tie'](http://en.cppreference.com/w/cpp/utility/tuple/tie)'(v1.z,v1 .y,v1.x) WhozCraig