是否允许将unordered_map转换为map?

时间:2011-11-02 15:17:03

标签: c++ boost map

正如标题所说,是否允许?如果没有,他们是否共享相同的接口或抽象类?我没有找到任何在线文件的参考。但看起来unordered_map和map都使用相同的功能。

4 个答案:

答案 0 :(得分:13)

不,它们完全不同,即使你用reinterpret_cast强制它,它也会在运行时出现可怕的错误(即可怕的未定义行为)。

它们都是STL容器,因此故意具有一致的接口。 这并不意味着它们在内部是相同的。

答案 1 :(得分:7)

他们是两种不相关的类型。如果你想基于另一个构造一个,你需要使用带有迭代器范围的构造函数(C ++ 11):

template <class InputIterator>
map(InputIterator first, InputIterator last,
    const Compare& comp = Compare(), const Allocator& = Allocator());

template <class InputIterator>
unordered_map(InputIterator f, InputIterator l,
              size_type n = see below,
              const hasher& hf = hasher(),
              const key_equal& eql = key_equal(),
              const allocator_type& a = allocator_type());

答案 2 :(得分:1)

STL类不使用虚函数;没有一致的基类可以通过(即,没有相当于Java的java.util.Map)。您不能在std::unordered_mapstd::map之间投射,而不能在HashMapTreeMap之间投射 - 它们是完全不同的类型,不能等效使用。

如果您希望函数能够获取多种类型的STL容器,只需使用模板函数:

template<typename Map>
void somefunc(Map &mymap) {
  // ...
}

答案 3 :(得分:-2)

你可以将一件事重新诠释给任何其他东西,即使它毫无意义。如果你强制它,编译器不会阻止你,这实质上是重新解释强制转换。将地图投射到unordered_map是没有意义的。不行。

为什么要将地图投射到unordered_map?它们具有相同的界面。通过施展它你什么都得不到。