2

我正在编写使用状态空间的类。我的问题是,我不知道将多个值用作unordered_map.


它应该以这种方式工作:

我创建具有值 <1;0;8> 的状态对象,因此它将作为<1;0;8>:pointer_to_object. 我想要哈希图,因为我需要尽快找到对象。


我考虑过使用vectortuple

unordered_map是否可以在不提前指定大小的情况下将其中一个用作键?


编辑:

我尝试使用@the_mandrill 推荐的代码,如下所示:

template <class T>
typedef std::unordered_map<std::vector<T>, State<T>*, boost::hash<std::vector<T>> Map;

template <class T>
size_t hash_value(const std::vector<T>& vec)
{
    std::size_t seed = 0;
    for (const auto& val : vec) {
      boost::hash_combine(seed, val);
    }
    return seed;
}

但我收到了这个错误:

stateSpaceLib.cpp:79:83: error: template argument 3 is invalid
 typedef std::unordered_map<std::vector<T>, State<T>*, boost::hash<std::vector<T>> Map;
                                                                                   ^
stateSpaceLib.cpp:79:1: error: template declaration of ‘typedef’
 typedef std::unordered_map<std::vector<T>, State<T>*, boost::hash<std::vector<T>> Map;
 ^
4

2 回答 2

1

您应该能够使用向量 - 单独使用或将其与您需要的任何其他状态数据一起包装在结构中,然后如果您有权访问 boost 然后使用hash_combine

typedef std::unordered_map<std::vector<int>, ObjectPointer, boost::hash<std::vector<int>> Map;

size_t hash_value(const std::vector<int>& vec)
{
    std::size_t seed = 0;
    for (const auto& val : vec) {
      boost::hash_combine(seed, val);
    }
    return seed;
 }
于 2015-08-30T20:59:22.060 回答
0

大小是 for 类型的一部分tuple,因此它不起作用。

但对于 ,情况并非如此vector,因此使用它作为键应该可以正常工作。

不幸的是,没有标准的重载std:hash接受 a vector<int>; 您也许可以使用 boost 来弥补这一点(http://en.cppreference.com/w/cpp/utility/hash)。或者,您可以提供自己的哈希函数。

于 2015-08-30T20:52:12.377 回答