我的朋友向我介绍了哈希表,以便轻松地将字符串与整数相关联,因此我尝试使用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'
我怀疑这是因为编译器已经过时了。这是为什么,还是有其他原因?如果它是由编译器引起的,是否有一种替代语法可用于避免将其更新到当前版本的漫长过程?
答案 0 :(得分:1)
unordered_map
是在c ++ 11中引入的,你的编译器似乎是从2009年开始的。
另一种方法是使用它的boost variant,或更新编译器。
答案 1 :(得分:1)
是的,这是过时的编译器的问题。但问题不在unordered_map
,而是将其作为自定义扩展程序实现为ext/hash_map
。一些使用适当的代码定义使名称一致。它刚刚正式进入c++11
的标准,但它在许多编译器中作为扩展实现了很长一段时间。
问题是emplace
和move
语义是相对较新的概念。它也为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安装。