我怎么能代表一个三维阵列状如何用地图表示3D数组?
myarray[1000][1000][1000];
这是一个大阵赋予超出了内存限制。每个单元都不会被使用,所以存在巨大的内存浪费。我想映射3个数字和值,有没有其他方法可以做到这一点?
我怎么能代表一个三维阵列状如何用地图表示3D数组?
myarray[1000][1000][1000];
这是一个大阵赋予超出了内存限制。每个单元都不会被使用,所以存在巨大的内存浪费。我想映射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;
}
非常好的解决方案! –
+1。如果你使用C++ 11,你也可以使用:['std :: tie'](http://en.cppreference.com/w/cpp/utility/tuple/tie)'(v1.z,v1 .y,v1.x)
'的std ::地图<整型,性病::地图<整型,性病::地图 >>'其中'T'是要保持类型。 –
您可以使用3个整数创建一个结构体,并将其用作地图的关键字。如果你这样做,记得设置*运算符<*函数。 – memo1288
可以使用静态数组内存的动态内存分配 –