C++ 无散列的无序映射

C++ 无散列的无序映射,c++,map,stl,C++,Map,Stl,我想使用一个类似std::map的结构,但不需要排序,我不需要排序,而且我的密钥非常大,所以“小于”比较需要时间。 所以,我看到了无序的_映射,但它有一个散列模板参数,那么,如何在不使用散列的情况下使用无序的_映射呢?我真的需要建立我自己的容器 这个问题也适用于std::set 编辑 一些答案建议创建我自己的散列,但我不能这样做,我应该在这里指定它。该键包含浮点数据,因此对其进行哈希运算将是一个非常糟糕的主意。我需要直接比较(std::equal_to)。创建自己的散列,通过在键的字段上组合的重

我想使用一个类似std::map的结构,但不需要排序,我不需要排序,而且我的密钥非常大,所以“小于”比较需要时间。 所以,我看到了无序的_映射,但它有一个散列模板参数,那么,如何在不使用散列的情况下使用无序的_映射呢?我真的需要建立我自己的容器

这个问题也适用于std::set

编辑
一些答案建议创建我自己的散列,但我不能这样做,我应该在这里指定它。该键包含浮点数据,因此对其进行哈希运算将是一个非常糟糕的主意。我需要直接比较(std::equal_to)。

创建自己的散列,通过在键的字段上组合的重载,很容易完成

(与前面的链接相同)非常好(即使您不需要模板):


顺便说一下,您还需要一个散列。

在声明无序映射之前,您需要为密钥指定散列对象

    namespace std
    {
    template <>
    class hash<Key>
    {
    public:
      size_t operator()(const Key &) const
      {
        // ... your hash function for Key object ...

      }
    };
    }

    std::unordered_map<Key, Value> myMap;
名称空间std
{
模板
类散列
{
公众:
size\u t运算符()(常数键和)常数
{
//…密钥对象的哈希函数。。。
}
};
}
std::无序图myMap;
例如,如果我希望您用作密钥对:

    namespace std
    {
    class hash<pair<string, int>>
    {
    public:
      size_t operator()(const pair<string, int> &s) const
      {
        size_t h1 = hash<string>()(s.first);
        size_t h2 = hash<int>()(s.second);
        return h1 ^ (h2 << 1);
      }
    };
    }

    unordered_map<pair<string, int>, string> myMap;
名称空间std
{
类散列
{
公众:
size\u t运算符()(常数对&s)常数
{
size\u t h1=散列()(s.first);
大小\u t h2=散列()(秒);

返回h1^(h2)您希望此容器能够做什么?
std::hash_map
等。提供基于散列的快速查找。如果您不需要散列,则无法获得快速查找或必须提供其他机制。听起来您希望将键映射到某个值。您设想如何实现该映射?
std::map
使用与定位对象的关系小于。排序只是从其内部结构中脱落。无序容器使用散列来定位对象,而不是排序。如果您不想这样做,则需要描述如何找到键…
std::unordered_map
可能更适合您的要求考虑如何成功地使用你自己的类型作为一个容器密钥。如何将我的类型设置为键。在std::map的情况下,运算符<重载的方式是根据从第一个字段到最后一个字段的检查进行“排序”。例如,如果a和b的第一个字段不相等,则返回哪个字段较小。如果a和b的第一个字段相等,则继续到第二个字段执行相同的操作。如果检查最后一个字段,并且它们相等,返回false。@LINK2012散列是在
float
double
上进行的……这甚至是由
std::hash
函数提供的……散列的目标只是细化存储桶,而不是更多或更少。但是浮点的std::hash只是散列其位(至少在GNU实现中),例如,5.12在IEEE中有“许多”表示方式representation@LINK2012我可能没有准确地表达我的观点,我的意思是@LINK2012他们没有寻找元素的精确匹配。在比较运算符上会有问题。如果在比较运算符上处理它,就不要散列浮点。
    namespace std
    {
    template <>
    class hash<Key>
    {
    public:
      size_t operator()(const Key &) const
      {
        // ... your hash function for Key object ...

      }
    };
    }

    std::unordered_map<Key, Value> myMap;
    namespace std
    {
    class hash<pair<string, int>>
    {
    public:
      size_t operator()(const pair<string, int> &s) const
      {
        size_t h1 = hash<string>()(s.first);
        size_t h2 = hash<int>()(s.second);
        return h1 ^ (h2 << 1);
      }
    };
    }

    unordered_map<pair<string, int>, string> myMap;