C++ 无序映射::g+中的定位错误+;v 3.4.4-999

C++ 无序映射::g+中的定位错误+;v 3.4.4-999,c++,c++11,g++,unordered-map,C++,C++11,G++,Unordered Map,我的朋友向我介绍了哈希表,这是一种将字符串与整数轻松关联的方法,因此我尝试在当前项目中使用std::unordered_map实现它们。下面显示了一个代码示例(为了简洁起见,没有显示完整的函数,标题也没有显示;我相信问题不存在于此): 无序地图世界::gentypetable(){ 无序映射哈希表; hashtable.emplace(“正常”,0); 哈希表。安放(“火”,1); 哈希表。安放(“水”,2); hashtable.emplace(“电动”,3); 哈希表。安放(“草”,4);

我的朋友向我介绍了哈希表,这是一种将字符串与整数轻松关联的方法,因此我尝试在当前项目中使用std::unordered_map实现它们。下面显示了一个代码示例(为了简洁起见,没有显示完整的函数,标题也没有显示;我相信问题不存在于此):

无序地图世界::gentypetable(){ 无序映射哈希表; hashtable.emplace(“正常”,0); 哈希表。安放(“火”,1); 哈希表。安放(“水”,2); hashtable.emplace(“电动”,3); 哈希表。安放(“草”,4); 但是,当我尝试使用g++3.4.4-999编译此代码时,收到以下错误:

error: 'class std::unordered_map<std::basic_string,<char>, int>' has no member named 'emplace'
错误:“class std::unordered_map”没有名为“emplace”的成员

我怀疑这是因为编译器过时了。这就是原因,还是有其他原因?如果是因为编译器,是否有其他语法可以用来避免将其更新到当前版本的漫长过程?

无序映射
是在c++11中引入的,您的编译器似乎是从2009年开始的


另一种方法是使用它的扩展名,或者更新编译器。

是的,这是过时的编译器的问题。但是问题不在于
无序的\u-map
它当时是作为
ext/hash\u-map
实现的自定义扩展名。一些代码使用了适当的定义来使名称一致。它只是官方的ly进入了
c++11
的标准,但它作为扩展在许多编译器中实现了很长一段时间

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

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

您可能可以尝试将
emplace
替换为普通的ol'
insert
。这可能涉及创建不必要的临时文件,但是这是一种非常传统的向STL容器添加元素的方法

旁注:gcc 3.4.4现在真的很老了,缺少一些关键的东西。它在优化算法方面也比新版本差很多。最好更新一下

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

是的。据我所知,这个函数直到4.8.0版本才实现。我有点惊讶于你的编译器竟然支持C++11,因为它比它早几年

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

你可以做一些类似的事情

hashtable.insert({"Normal",0});
如果编译器支持大括号初始化;或者有类似数组的语法

hashtable["Normal"] = 0;

请注意,如果密钥已存在,则这些具有不同的行为;第一个密钥不起任何作用,而第二个密钥替换现有值。

您使用的是旧编译器。请为所有人,尤其是小猫更新,因为在使用旧编译器时,小猫将不可避免地被杀死


请参阅。简言之,通过安装。

如果您对编程非常感兴趣,我建议您更新工具链(包括编译器)。我不明白为什么它很长,但g++3.4.4现在已经非常过时,使用此版本会有很多麻烦(版本4.8.2是最新版本)。感谢大家的快速回答,我很高兴看到这只是编译器的一个问题。我使用该版本是因为我使用的是Cygwin,直到今天我一直认为它是最新的。您建议我升级到哪个环境,或者在Cygwin中更新编译器可以正常工作?(这就是为什么我提到了一个长时间的升级;Cygwin的网站说它至少需要一个小时。)对于Windows上的gcc,我更喜欢MinGW64。好的,MinGW64是一个共识还是有其他的观点?另外,MinGW64是否允许我创建独立的Windows应用程序(我认为Cygwin无法实现这一点)?再次感谢大家提供的有用答案。问题不是
未重新定义的\u map
,编译器会这么说。问题是
emplace
。你是对的,问题仍然是过时的编译器。因此结果仍然是一样的:提升或更新编译器。对我来说,使用旧调用似乎不是最佳做法:)
emplace
做了一些不同的事情。我称之为
insert
legacy,因为它和容器一样旧。不是后来添加的,所以它应该可以工作。它不是过时的。有时切换编译器不是那么容易。你建议像his一样,它不提供
无序映射,而显然它提供了。它不提供方法OP用于向其中插入元素,但还有其他选项。不过,我同意在这种情况下,更新的编译器是一个非常好的建议。我并不感到意外,AFAIK哈希映射非常接近于使其成为标准的早期版本(
03
)。这就是为什么许多旧的编译器提供类似于自定义扩展的东西。而且它基本上是一种数据结构,因此可以在任何编译器版本中实现它。
emplace
是一种全新的语法。而且任何新的语法都很可能无法工作。@luk32:事实上,类似的东西在STL、TR1和Boost中都存在2000年。我感到惊讶的是,它以C++11的形式存在(即作为
std::unordered\u map
)那么早;但也许我只是感到惊讶,因为我当时没有特别遵循标准化过程。那可能是一些自定义代码。它的名称不同。名称我记得它是
散列图
。可能有人使用了这样的技巧。我很确定它们的名称与
无序图
,eve不同在VisualStudio中。在行为上有一些细微的(或多或少的)差异
hashtable["Normal"] = 0;