1

我如何表示一个 3D 数组,如

myarray[1000][1000][1000];

这是一个大型数组,超出了内存限制。不会使用每个单元格,因此会浪费大量内存。我想映射 3 个数字和值,还有其他方法吗?

4

1 回答 1

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;
}
于 2013-09-28T06:00:34.850 回答