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

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'

我怀疑这是因为编译器已过时。那是为什么,还是还有其他原因?并且,如果这是由于编译器引起的,是否可以使用其他语法来避免将其更新为当前版本的冗长过程?

最佳答案

是的,这是过时的编译器的问题。但是,问题不在于unordered_map,它是作为自定义扩展实现的,然后又实现为ext/hash_map。一些用于适当定义的代码使名称保持一致。它只是正式加入c++11的标准,但是在很多编译器中作为扩展已经实现了很长时间。

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

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

您可能会尝试将emplace交换为纯ol'insert。它可能涉及创建不必要的临时对象,但是这是向STL容器添加元素的相当古老的方法。

旁注:gcc 3.4.4现在真的很旧,并且缺少一些关键的东西。与更新版本相比,在优化算法方面也很差。更新会很好。

10-07 19:29
查看更多