您好我曾经有一个unordered_set来保存我的16个int数组,现在我需要再存储一个int作为其存储桶。我想知道我是否可以将数组插入到我的unordered_set中,或者我可以使用我以前使用的相同模板吗?
#include <unordered_set>
#include <array>
namespace std
{
template<typename T, size_t N>
struct hash<array<T, N> >
{
typedef array<T, N> argument_type;
typedef size_t result_type;
result_type operator()(const argument_type& a) const
{
hash<T> hasher;
result_type h = 0;
for (result_type i = 0; i < N; ++i)
{
h = h * 31 + hasher(a[i]);
}
return h;
}
};
}
std::unordered_set<std::array<int, 16> > closelist;
int main()
{
std::array<int, 16> sn = {1,2,3,4,5,6,0,8,9,10,11,12,13,14,7,15};
closelist.insert(sn);
}
我可以将其改为此吗?
std::unordered_map<std::array<int, 16>,int > closelist;
int main()
{
std::array<int, 16> sn = {1,2,3,4,5,6,0,8,9,10,11,12,13,14,7,15};
closelist.insert(sn,24);
}
我无法理解模板,我想知道什么是“h = h * 31 + hasher(a [i]);”?
谢谢!!!
答案 0 :(得分:1)
我可以将其改为此吗?
首先,你的数组初始化是错误的:
std::array<int, 16> sn = {{1,2,3,4,5,6,0,8,9,10,11,12,13,14,7,15}};
// ^ ^
由于std::array
没有带std::initializer_list
的构造函数作为参数。因此,第一级用于初始化对象,第二级用于初始化对象中的数组。
其次,来自reference:
std::pair<iterator,bool> insert( const value_type& value ); template <class P> std::pair<iterator,bool> insert( P&& value );
所以,你应该传递std::pair
(或某些东西,可转换为std::pair
),例如:
closelist.insert({sn,24});
或者,更简单:
closelist[sn] = 24;
答案 1 :(得分:1)
如何将任何对象用作键:
缺点是您可能需要以某种方式解决冲突。