我必须按如下所述在程序中存储一些数据。
数据是高维坐标,这些坐标中的点数。以下是一个简单示例(坐标尺寸为5):
coordinate # of points
(3, 5, 3, 5, 7) 6
(6, 8, 5, 8, 9) 4
(4, 8, 6, 7, 9) 3
请注意,即使我以5维为例,实际的问题还是20维。坐标始终是整数。
我想将此信息存储在某种数据结构中。我想到的第一件事是哈希表。我在STL中尝试了unordered_map
。但是无法弄清楚如何将坐标用作unordered_map
中的键。将其定义为:
unordered_map<int[5], int> umap;
或
unordered_map<int[], int> umap;
给我一个编译错误。我在做什么错了?
答案 0 :(得分:0)
unordered_map
需要知道如何哈希。此外,它还需要一种方法来比较相等性的坐标。
您可以将坐标包装在class
或struct
中,并提供自定义operator ==来比较坐标点。然后,您需要专门化std::hash才能将您的Point
结构用作unordered_map
中的键。虽然比较坐标是否相等非常简单,但是要由您决定如何对坐标进行哈希处理。以下是您需要实现的概述:
#include <vector>
#include <unordered_map>
#include <cmath>
class Point
{
std::vector<int> coordinates;
public:
inline bool operator == (const std::vector<int>& _other)
{
if (coordinates.size() != _other.size())
{
return false;
}
for (uint c = 0; c < coordinates.size(); ++c)
{
if (coordinates[c] != _other[c])
{
return false;
}
}
return true;
}
};
namespace std
{
template<>
struct hash<Point>
{
std::size_t operator() (const Point& _point) const noexcept
{
std::size_t hash;
// See https://www.boost.org/doc/libs/1_67_0/doc/html/hash/reference.html#boost.hash_combine
// for an example of hash implementation for std::vector.
// Using Boost just for this might be an overkill - you could use just the hash_combine code here.
return hash;
}
};
}
int main()
{
std::unordered_map<Point, int> points;
// Use points...
return 0;
}
如果您知道将要拥有多少个坐标,可以像这样命名
struct Point
{
int x1;
int x2;
int x3;
// ...
}
您可以使用我专门为此编写的仅标头的hashing library。您的里程可能会有所不同。