C++中unordered_map的版本兼容性问题

21 篇文章 0 订阅

背景

在C++中最让我蛋疼的事情之一就是unordered_map千呼万唤才出来,在C++早期版本标准库里面只有map这个字典。 但是map的内部实现是采用的红黑树,众所周知,对于字典这类结构也可以用hash表来实现,也就是C++的标准库应该也要有hash_map这种数据结构。

  • 红黑树实现的map占用内存较小,但是查找效率不高,O(logn)的查找效率。
  • hash表实现的map占用内存较大,但是查找效率高,往往可以逼近O(1)的惊人查找效率。

在C++中关于map的hash表方法的实现是unordered_map这个数据结构,首次出现应该是在C++98那个年代的tr1这个命名空间里面出现。 使用方法写起来比较啰嗦。

#include <tr1/unordered_map>
using std::tr1::unordered_map;

我认为像unordered_map这个数据结构差不多就是C++程序员的柴米油盐,生活必需品。 但是由于C++标准委员会的懒散,硬生生是拖到c++0x/c++11标准才把unordered_map纳入std标准。 也就是只有在支持-std=c++0x甚至-std=c++11的编译器里(对于g++来说大概是g++4.4这个版本以上的才开始支持),才可以用如下代码使用unordered_map

#include <unordered_map>
using std::unordered_map;

假设如果全世界所有的g++都已经是4.4版本以上了,那使用unordered_map就不再有任何问题,但是现实是残酷的,总会在世界某些角落的服务器, 仍然在使用g++-4.1.x,而且对于这些服务器来说升级g++还麻烦得很。所有我们的程序就要考虑对于低级版本的兼容 。

解决方法

#if(__cplusplus == 201103L)
#include <unordered_map>
#include <unordered_set>
#else
#include <tr1/unordered_map>
#include <tr1/unordered_set>
namespace std
{
    using std::tr1::unordered_map;
    using std::tr1::unordered_set;
}
#endif

这个解决方法主要是依靠__cplusplus这个宏在不同C++版本中的值不同。 对于(能够使用且)使用了-std=c++0x或者-std=c++11编译选项的编译过程,__cplusplus的值是201103L,否则则是其他值。

结论

上述方法最低大概只能支持到C++98这个标准了,因为到了C++98才开始有tr1/unordered_map,所以你的编译器如果连C++98都不支持的话,那就乖乖用远古时代流传至今的map吧。

参考资料

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这个问题可能有多种可能性,以下是一些可能的原因和解决方法: 1. 缺少头文件:使用map需要包含头文件<map>,如果没有包含这个头文件,会导致无法解析外部指令的错误。 解决方法:在代码包含头文件<map>。 2. 命名空间问题:map位于std命名空间,如果没有使用命名空间std::,也会导致无法解析外部指令的错误。 解决方法:在代码使用命名空间std::,或者在使用map之前添加using namespace std;语句。 3. 编译选项问题:如果编译选项没有包含库文件,也会导致无法解析外部指令的错误。 解决方法:在编译选项添加库文件,例如使用gcc编译时,需要添加-lstdc++选项。 4. 编译器版本问题:有些较旧的编译器可能不支持map等STL容器。 解决方法:升级编译器或者使用其他容器代替map。 希望以上解决方法可以帮助到你。如果问题仍然存在,请提供更多的细节信息,以便更好地解决问题。 ### 回答2: 在C语言使用map后产生无法解析的外部指令可能是由于以下几个原因所导致的。 首先,可能是因为在程序没有包含相关的头文件。mapC++标准库的一个容器,如果在C语言程序使用map,需要包含相关的头文件,如<map.h>或<unordered_map.h>。如果没有正确包含头文件,编译器就无法解析map相关的函数和类型,从而导致无法解析的外部指令错误。 其次,可能是由于链接错误导致的。当在C语言程序使用map后,链接器可能无法找到与map相关的库文件。解决这个问题的方法是在编译链接时显式地指定使用相关的库文件,如使用-lstdc++选项来链接C++标准库。 另外,还有可能是因为编译器版本不兼容导致的。不同版本的C编译器对C++语言的支持程度可能不同,有些编译器可能无法正确解析map相关的语法和函数调用。在这种情况下,可以尝试更新或更换编译器版本来解决问题。 总之,在C语言使用map容器可能会遇到无法解析的外部指令错误,可能是由于缺少相关的头文件、链接错误或编译器版本不兼容所导致。通过正确包含头文件、显式指定链接库文件或更换更新的编译器版本,可以解决这个问题。 ### 回答3: 使用map时,如果产生无法解析的外部指令,可能是由于以下原因之一: 1. 路径错误:当使用map时,需要提供正确的文件路径或目录路径。如果路径不正确,系统将无法解析找到指定的外部指令。 2. 缺少依赖库:某些外部指令可能需要依赖于其他库或程序。如果缺少所需的依赖库,系统将无法解析和执行指令。 3. 环境变量问题:有时,外部指令需要特定的环境变量设置才能正常解析和执行。如果环境变量未正确设置或缺少必要的变量,系统将无法正确解析指令。 4. 权限问题:如果当前用户没有足够的权限执行外部指令,系统将无法解析和执行指令。在这种情况下,需要使用具有足够权限的用户来执行指令。 为了解决这些问题,可以尝试以下方法: 1. 检查路径:确认提供的路径是正确的,并且存在相关的文件或目录。 2. 安装依赖库:检查所需的依赖库是否已正确安装,并确保库的路径被正确设置。 3. 设置环境变量:如果外部指令需要特定的环境变量设置,请检查环境变量是否正确设置,并确保路径和其他变量值正确。 4. 检查权限:确认当前用户是否具有执行外部指令的足够权限,如果没有,可以尝试使用具有足够权限的用户来执行指令。 如果仍然无法解决问题,可以尝试搜索相关错误消息或在开发者社区提问以获取更多帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值