我怎麼能代表一個三維陣列狀如何用地圖表示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
可以使用靜態數組內存的動態內存分配 –