hashmap映射,无序映射,类作为键

hashmaps maps, unordered maps, with classes as keys

本文关键字:映射 无序 hashmap      更新时间:2023-10-16

我在尝试使用STL映射时会遇到很多不同的问题,这真的很令人沮丧

所以我有很多问题:

  • 首先我遇到了一些问题<操作符未定义",但我不需要在我的映射中进行任何排序(为什么在默认情况下任何人都需要)我找到了unordered_map但我得用c++11之类的,不知道这是什么意思我不确定这是个好主意,它是标准c吗?>

  • 然后我得到了一些奇怪的错误:

    /usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ' struct std::hash

那么为什么模板如此具有侵入性呢?我的意思是,它应该充当一个容器,不管对象是什么,也不管它里面是什么

谁能帮我解决这个错误?

谢谢

首先我遇到了一些"& lt;操作符未定义,但我不需要在我的映射(为什么在默认情况下需要它呢)

来自文档:

std::map是一个排序的关联容器,包含键值对具有唯一的密钥。键通过比较排序比较函数

我特别强调。缺省情况下,比较函数为operator <

所以我找到了unordered_map,但我必须使用c++11或其他东西,不知道它是什么意思,我不确定这是一个好主意,它是标准c吗?可携带吗?

c++ 11是最新的c++标准的名称。到目前为止,大多数现代编译器都支持该标准的大多数主要特性。如果您的编译器支持它,那么使用您需要的特性是一个好主意。它不是标准的C,但它是标准的c++。

然后我得到了一些奇怪的错误:

/usr/include/c++/4.8/bits/hashtable_policy.h:1070:12: error: invalid use of incomplete type ' struct std::hash '

std::unordered_map是一个哈希表。默认情况下,std::unordered_map<Key, Value>使用的散列函数是std::hash<Key>的专门化。您会得到这个错误,因为您的类型FOLVariable不存在这样的专门化。

map按键存储元素;所以你需要定义排序。

如果键是类类型,您可以重载operator<,使std::less的默认顺序工作:

bool operator<(my_thing const & a, my_thing const & b) {
    // return true if "a" is ordered before "b"
}
std::map<my_thing, something_else> my_map;

或者您可以提供自己的比较函子

struct compare_my_thing {
    bool operator()(my_thing const & a, my_thing const & b) {
        // return true if 'a' is ordered before 'b'
    }
};
std::map<my_thing, something_else, compare_my_thing> my_map;

unordered_map是一个哈希表;因此,您需要定义散列函数和比较是否相等的方法(因为散列通常不是唯一的)。同样,您可以提供重载,以便缺省值(std::hashstd::equal_to)可以工作:

namespace std {
    template <>
    struct hash<my_thing> {
        std::size_t operator()(my_thing const & t) const {
            // return hash of 't'
        }
    };
}
bool operator==(my_thing const & a, my_thing const & b) {
    // return true if 'a' and 'b' are equal
}
std::unordered_map<my_thing, something_else> my_map;

或者可以提供自己的函子

struct hash_my_thing {
    std::size_t operator()(my_thing const & t) const {
        // return hash of 't'
    }
};
struct compare_my_thing {
    bool operator()(my_thing const & a, my_thing const & b) {
        // return true if 'a' and 'b' are equal
    }
};
std::unordered_map<my_thing, something_else, hash_my_thing, compare_my_thing> my_map;

那么为什么模板如此具有侵入性呢?我的意思是,它应该充当一个容器,不管对象是什么,也不管它里面是什么

不同的容器对其所包含的类型有不同的要求。例如,它们都要求容器是可破坏的,因为容器负责管理它们的生命周期。有些要求它们是可移动的;例如,vector在分配更大的数组时需要移动元素来保存它们。关联容器对它们的键类型有额外的要求,以允许它们被用作键。