C ++如何将数组插入unordered_map作为其键?

时间:2013-06-14 15:28:41

标签: c++ c++11 unordered-map

您好我曾经有一个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]);”?

谢谢!!!

2 个答案:

答案 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)

如何将任何对象用作键:

  1. 将对象序列化为字节数组(对于int数组,只需按原样使用二进制数据)
  2. 计算加密哈希值(MD5或SHA)
  3. 将加密哈希转换为指纹值(例如,将其前64位转换为uint64_t)
  4. 将此指纹用作地图密钥
  5. 缺点是您可能需要以某种方式解决冲突。