map和hash_map性能测试.果然是map综合性能较强。

本文通过实验对比了C++ STL中map与hash_map在不同数据规模下的性能表现,包括添加、删除、查找和遍历操作,揭示了两者在实际应用场景中的优劣。
 大家都知道在C++的STL中map是使用树来做查找算法,而hash_map使用hash表来排列配对,是使用关键字来计算表位置。那使用起来他们的差别主要是什么呢?对于性能差别是什么,适合什么情况下应用呢?于是我对它们进行了一些测试,并记录了测试数据供大家分享。
测试的内容主要是map和hash_map的添加、删除、查找和遍历操作,首先进行了几组测试,分别是10万次、30万次,时间单位均为毫秒,具体的性能对照如下:
hash_map(10万) map(10万) hash_map(20万) map(20万) hash_map(30万) map(30万)
添加 93 47 156 94 203 172
遍历 16 15 16 16 16 15
查找 0 0 32 31 31 32
删除 8422 32 33765 63 76016 78
通过上面的数据比较,我们很容易发现hash_map的添加和删除操作比map要慢,尤其是删除操作hash_map比map可能慢1000倍;从而得到结论是删除和插入操作较多的情况下,map比hash_map的性能更好,添加和删除的数据量越大越明显。但我们使用map、hash_map一般都用于查找和遍历较多,而且上述测试数据也不能反映出这两方面的性能差距,于是继续对查找和遍历进行了性能测试,得到具体数据如下,时间单位仍为毫秒:
hash_map(100万) map(100万) hash_map(200万) map(200万) hash_map(300万) map(300万)
遍历 94 31 203 32 297 47
查找 94 234 188 531 281 875
通过上面的测试数据可以得出结论是map的遍历性能高于hash_map,而查找性能则相反,hash_map比map要好,数据量越大查找次数越多,表现就越好。
两大组测试完毕,整体结论也可以得出:一般应用情况下,我们保存的数据不超过100万份,查找的频繁程度不高情况下使用map性能比较好;而保存的数据较多时(超过100万),查找频繁时使用hash_map的性能就高于map了。测试环境具体如下:
操作系统:Windows XP Professional (5.1, Build 2600) Service Pack 3 (2600.xpsp_sp3_gdr.080814-1236)
编译环境:Microsoft Visual C++ 2005

55603-007-4000003-41525
处理器:Intel(R) Core(TM)2 Duo CPU P8600 @ 2.40GHz (2 CPUs)
内存:2044MB RAM,
另外,整个测试仅使用物理内存,而没有虚拟内存,使用Release版本直接在控制台中运行,而没有在IDE中运行,避免影响性能;且对于较短时间计时,少于20毫秒以下可能不准确。

### C++ `unordered_map` 与 `hash_map` 的区别、用法及性能特点 #### 区别 1. 标准化状态:`unordered_map` 是 C++ 标准库的一部分,自 C++11 起被引入并广泛支持。而 `hash_map` 并非 C++ 标准库的一部分,而是某些编译器(如 GNU C++)提供的扩展容器[^2]。 2. 可移植性:由于 `hash_map` 不属于标准库,其跨平台兼容性可移植性较差。相比之下,`unordered_map` 在所有支持 C++11 的编译器中均可使用[^5]。 #### 用法 - **`unordered_map`**: - 需要包含头文件 `<unordered_map>`。 - 声明方式为 `std::unordered_map<键类型, 值类型>`。 - 示例代码如下: ```cpp #include <iostream> #include <unordered_map> #include <string> int main() { std::unordered_map<std::string, int> myMap = {{"apple", 5}, {"banana", 3}, {"orange", 8}}; for (const auto& pair : myMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` - **`hash_map`**: - 需要包含特定的头文件,例如在 GNU C++ 中为 `<ext/hash_map>`。 - 声明方式为 `__gnu_cxx::hash_map<键类型, 值类型>`。 - 示例代码如下: ```cpp #include <iostream> #include <ext/hash_map> #include <string> using namespace __gnu_cxx; int main() { hash_map<std::string, int> myHashMap = {{"apple", 5}, {"banana", 3}, {"orange", 8}}; for (const auto& pair : myHashMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` #### 性能特点 1. **时间复杂度**:两者均基于哈希表实现,提供平均 O(1) 的插入、查找删除操作复杂度[^1]。 2. **空间利用率**:由于 `unordered_map` 是标准库的一部分,其实现经过优化,在大多数情况下具有更高的空间利用率更好的性能表现。 3. **扩展性**:`unordered_map` 支持更多的自定义选项,例如通过模板参数指定哈希函数等价比较函数,从而更灵活地适配不同的键类型[^4]。 #### 注意事项 对于内置类型(如 `int`、`std::string` 等),`unordered_map` `hash_map` 均无需额外定义哈希函数或等价比较函数。但对于自定义类型,需要重载 `operator==` 定义适当的哈希函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值