g ++ v 3.4.4-999中的unordered_map :: emplace错误

时间:2013-11-21 13:35:52

标签: c++ c++11 g++ unordered-map

我的朋友向我介绍了哈希表,以便轻松地将字符串与整数相关联,因此我尝试使用std :: unordered_map在我当前的项目中实现它们。代码示例如下所示(为简洁起见,未显示完整功能,标题也未显示;我确信问题不存在于此处):

unordered_map <string,int> world::gentypetable(){
    unordered_map <string,int> hashtable;
    hashtable.emplace("Normal",0);
    hashtable.emplace("Fire",1);
    hashtable.emplace("Water",2);
    hashtable.emplace("Electric",3);
    hashtable.emplace("Grass",4);

但是,当我尝试使用g ++ 3.4.4-999编译此代码时,收到以下错误:

error: 'class std::unordered_map<std::basic_string,<char>, int>' has no member named 'emplace'

我怀疑这是因为编译器已经过时了。这是为什么,还是有其他原因?如果它是由编译器引起的,是否有一种替代语法可用于避免将其更新到当前版本的漫长过程?

4 个答案:

答案 0 :(得分:1)

unordered_map是在c ++ 11中引入的,你的编译器似乎是从2009年开始的。

另一种方法是使用它的boost variant,或更新编译器。

答案 1 :(得分:1)

是的,这是过时的编译器的问题。但问题不在unordered_map,而是将其作为自定义扩展程序实现为ext/hash_map。一些使用适当的代码定义使名称一致。它刚刚正式进入c++11的标准,但它在许多编译器中作为扩展实现了很长一段时间。

问题是emplacemove语义是相对较新的概念。它也为c++11标准化,但只有大多数现代编译器支持它。

这就是为什么编译器可能识别并能够使用哈希映射,但不知道方法本身。

你可能会尝试将emplace换成普通的“insert。它可能涉及创建不必要的临时值,但这是向STL容器添加元素的常用方法。

旁注:gcc 3.4.4现在已经很老了,缺少一些关键的东西。与其较新的版本相比,它在优化算法方面也相当差。更新会很好。

答案 2 :(得分:1)

  

我怀疑这是因为编译器已经过时了。

是。根据{{​​3}},该功能直到版本4.8.0才实现。我有点惊讶你的编译器完全支持C ++ 11,因为它比它早了几年。

  

是否有替代语法可用于避免将其更新到当前版本的漫长过程?

你可以做一些像

这样的事情
hashtable.insert({"Normal",0});

如果您的编译器支持大括号初始化;或者是类似数组的语法

hashtable["Normal"] = 0;

请注意,如果密钥已存在,则这些行为会有所不同;第一个没有做任何事情,而第二个替换现有值。

答案 3 :(得分:0)

您使用的是旧编译器。请更新为每个人,尤其是使用旧编译器时不可避免地会被杀死的小猫。

this question on how to install GCC on Windows。简而言之,请通过the installer安装。