使用unordered_map在STL中存储键值对

时间:2018-08-06 00:16:32

标签: c++ data-structures unordered-map

我必须按如下所述在程序中存储一些数据。

数据是高维坐标,这些坐标中的点数。以下是一个简单示例(坐标尺寸为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;

给我一​​个编译错误。我在做什么错了?

1 个答案:

答案 0 :(得分:0)

unordered_map需要知道如何哈希。此外,它还需要一种方法来比较相等性的坐标。

您可以将坐标包装在classstruct中,并提供自定义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。您的里程可能会有所不同。