您可能考虑的一个解决方案是使用稀疏网格作为您的 ADT。
这std::unordered_map
是一个哈希映射,可用于创建稀疏网格数据结构。如果你为 3d 向量编写了一个好的散列,你可以获得很好的 O(1) 读取性能,这将接近原始数组的性能。
散列映射还允许您使用“几乎无限”的区域(当然,约束将在基础数据类型中。
抱歉耽搁了。
对于 unordered_map,这是一个很好的信息资源:unordered_map hash function c++
我在自己的项目中使用一对整数实现,但我确信它可以用于三维坐标。
namespace std {
template <class T>
inline void hash_combine(std::size_t & seed, const T & v) {
std::hash<T> hasher;
seed ^= hasher(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
template<> struct hash<pair<int, int> > {size_t operator()(pair<int, int> x) const { size_t seed=0; hash_combine(seed, x.first); hash_combine(seed, x.second); return(seed); } };
}
然后你可以声明你的unordered_map
std::unordered_map<std::pair<int, int>, [VALUE] > my_map; //[VALUE] being the data type of vertex
在此之后,您可以将结构视为常规std::map
. 如果您不确定如何使用其中一个,这里有很多示例。
对于 3d 坐标,您可以声明自己的结构
struct vector
{
int i,j,k;
};
然后修改哈希函数(为了可读性而格式化)
template<> struct hash<vector > {
size_t operator()(vector x) const {
size_t seed=0;
hash_combine(seed, x.i);
hash_combine(seed, x.j);
hash_combine(seed, x.k);
return(seed);
}
};