hashmaps地图,无序地图,以类作为键

时间:2014-03-24 15:02:42

标签: c++ stl

我在尝试使用STL地图时遇到了很多不同的问题,实在令人沮丧

所以我有很多问题:

  • 首先我遇到了一些“<运算符未定义”的问题,但我不需要在我的地图中进行任何排序(为什么默认情况下任何人都需要这样做) 所以我发现unordered_map但我必须使用c ++ 11或其他东西,不知道它意味着什么 我不确定这是一个好主意,它是标准的吗?它是便携式的吗?

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

    / usr / include / c ++ / 4.8 / bits / hashtable_policy.h:1070:12:错误:无效使用不完整类型'struct std :: hash< FOLVariable>”

那么为什么模板如此具有侵入性呢?我的意思是它应该充当一个容器,而不是关注对象的内容和内部的内容

任何人都可以帮我解决这个错误吗?

感谢

2 个答案:

答案 0 :(得分:0)

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;
  

那么为什么模板如此具有侵入性呢?我的意思是它应该充当一个容器,而不是关注对象的内容和内部的内容

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

答案 1 :(得分:0)

  

首先我遇到了一些“&lt;运算符未定义”的问题,但我不需要任何订购   地图(为什么任何人都会默认需要它)

来自documentation

  

std :: map是一个包含键值的排序关联容器   配有唯一键。使用比较对键进行排序   功能比较

强调我的。默认情况下,比较函数为operator <

  

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

C ++ 11是最新C ++标准的名称。大多数现代编译器现在支持该标准的大多数主要功能。如果您的编译器支持它,那么使用您需要的功能是个好主意。它不是标准的C,但它是标准的C ++。

  

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

     

/ usr / include / c ++ / 4.8 / bits / hashtable_policy.h:1070:12:错误:无效使用不完整类型'struct std :: hash&lt; FOLVariable&GT;”

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