【问题标题】:unordered_map with iterators as keys, cast iterator to long long?unordered_map 以迭代器为键,将迭代器转换为 long long?
【发布时间】:2016-12-14 20:32:06
【问题描述】:

不幸的是:

unordered_map<list<int>::iterator, int> foo;

不起作用,编译器说:error C2338: The C++ Standard does not provide a hash for this type.

似乎有一个 64 位整数的散列,所以它是否可以保存使用

unordered_map<long long, int> foo;

而是简单地将迭代器转换为long long?

【问题讨论】:

    标签: c++11 casting hashmap iterator c++-standard-library


    【解决方案1】:

    不,这通常是不可能的。虽然 pointers 可以在整数类型之间进行转换(稍后会详细介绍),但迭代器不一定是指针,因此不一定允许这种转换。例如,考虑像 istream_iterator 这样的东西,它包装了一个流对象。目前尚不清楚将其投射到 long long 或从 long long 投射意味着什么。如果您尝试以这种方式解决问题,则可能需要改变方法。

    请注意 - long long 类型实际上并不需要足够大以容纳已转换为整数的指针。特殊类型 intptr_tuintptr_t 保证足够大以存储指针,因此您可能希望开始使用这些类型。不过,您仍然不能将列表迭代器强制转换为这些类型。

    【讨论】:

    • 使用迭代器指向的对象的地址怎么样?也许我可以用它作为钥匙?
    • 这应该可行,前提是您不需要将指针视为迭代器。出于好奇,你想做什么?您可能想发布一个单独的问题来描述您的目标,因为我怀疑您可能缺少解决此问题的更简洁的方法。
    • 我想遍历重对象图,因此我有一个指向这些对象的迭代器向量,但我也需要逆映射以进行广度/深度优先搜索。可能有高效的图形库,但我需要的不仅仅是这个遍历函数。
    • 我建议将此作为一个单独的问题提出,更详细地描述您正在尝试做什么以及您目前如何解决它。这将使您的问题更加引人注目,并可能让人们提出更好的方法来实现您的目标。
    猜你喜欢
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-18
    • 2011-03-24
    • 2011-09-02
    • 1970-01-01
    • 2011-01-03
    相关资源
    最近更新 更多