当前位置: 代码网 > it编程>编程语言>C/C++ > C++ 各种map特点对比分析

C++ 各种map特点对比分析

2025年03月22日 C/C++ 我要评论
特点比较1. std::map底层实现:基于红黑树(一种自平衡的二叉搜索树)。元素顺序:元素按照键(key)的升序排列。键的唯一性:每个键只能出现一次,插入重复键的元素会被忽略。查找效率:查找操作的时

特点比较

1. std::map

  • 底层实现:基于红黑树(一种自平衡的二叉搜索树)。
  • 元素顺序:元素按照键(key)的升序排列。
  • 键的唯一性:每个键只能出现一次,插入重复键的元素会被忽略。
  • 查找效率:查找操作的时间复杂度为 o ( l o g n ) o(log n) o(logn),其中 n n n 是容器中元素的数量。
  • 插入和删除效率:插入和删除操作的时间复杂度也为 o ( l o g n ) o(log n) o(logn)

2. std::unordered_map

  • 底层实现:基于哈希表。
  • 元素顺序:元素没有特定的顺序,存储位置由键的哈希值决定。
  • 键的唯一性:每个键只能出现一次,插入重复键的元素会覆盖原有的元素。
  • 查找效率:平均情况下,查找操作的时间复杂度为 o ( 1 ) o(1) o(1),但在最坏情况下可能达到 o ( n ) o(n) o(n)
  • 插入和删除效率:平均情况下,插入和删除操作的时间复杂度为 o ( 1 ) o(1) o(1)

3. std::multimap

  • 底层实现:同样基于红黑树。
  • 元素顺序:元素按照键的升序排列。
  • 键的唯一性:允许键重复,即可以有多个元素具有相同的键。
  • 查找效率:查找操作的时间复杂度为 o ( l o g n ) o(log n) o(logn)
  • 插入和删除效率:插入和删除操作的时间复杂度为 o ( l o g n ) o(log n) o(logn)

4. std::unordered_multimap

  • 底层实现:基于哈希表。
  • 元素顺序:元素没有特定的顺序,由键的哈希值决定存储位置。
  • 键的唯一性:允许键重复。
  • 查找效率:平均情况下,查找操作的时间复杂度为 o ( 1 ) o(1) o(1),最坏情况下为 o ( n ) o(n) o(n)
  • 插入和删除效率:平均情况下,插入和删除操作的时间复杂度为 o ( 1 ) o(1) o(1)

5. hash_map(sgi stl 扩展)

  • 底层实现:基于哈希表。
  • 元素顺序:元素没有特定的顺序,由键的哈希值决定存储位置。
  • 键的唯一性:每个键只能出现一次,插入重复键的元素会覆盖原有的元素。
  • 查找效率:平均情况下,查找操作的时间复杂度为 o ( 1 ) o(1) o(1),最坏情况下为 o ( n ) o(n) o(n)
  • 插入和删除效率:平均情况下,插入和删除操作的时间复杂度为 o ( 1 ) o(1) o(1)
    在早期的 c++ 标准(如 c++98、c++03)中有 hash_map,不过它并非标准库的一部分,而是来自于 sgi stl 扩展。在 c++11 及以后的标准中,hash_mapstd::unordered_map 替代,std::unordered_map 成为标准的哈希表实现。不过有些编译器仍然支持 hash_map,下面为你加入 hash_map 并进行比较,同时给出相应的 c++ 示例代码。

c++ 示例代码 ​​​​​​

#include <iostream>
#include <map>
#include <unordered_map>
#include <ext/hash_map>  // 对于支持 hash_map 的编译器
// 演示 std::map 的使用
void teststdmap() {
    std::map<int, std::string> mymap;
    mymap[1] = "apple";
    mymap[2] = "banana";
    mymap[1] = "cherry";  // 键 1 重复,会覆盖原有的值
    std::cout << "std::map:" << std::endl;
    for (const auto& pair : mymap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
}
// 演示 std::unordered_map 的使用
void testunorderedmap() {
    std::unordered_map<int, std::string> myunorderedmap;
    myunorderedmap[1] = "apple";
    myunorderedmap[2] = "banana";
    myunorderedmap[1] = "cherry";  // 键 1 重复,会覆盖原有的值
    std::cout << "\nstd::unordered_map:" << std::endl;
    for (const auto& pair : myunorderedmap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
}
// 演示 std::multimap 的使用
void testmultimap() {
    std::multimap<int, std::string> mymultimap;
    mymultimap.insert({1, "apple"});
    mymultimap.insert({2, "banana"});
    mymultimap.insert({1, "cherry"});  // 键 1 重复,允许插入
    std::cout << "\nstd::multimap:" << std::endl;
    for (const auto& pair : mymultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
}
// 演示 std::unordered_multimap 的使用
void testunorderedmultimap() {
    std::unordered_multimap<int, std::string> myunorderedmultimap;
    myunorderedmultimap.insert({1, "apple"});
    myunorderedmultimap.insert({2, "banana"});
    myunorderedmultimap.insert({1, "cherry"});  // 键 1 重复,允许插入
    std::cout << "\nstd::unordered_multimap:" << std::endl;
    for (const auto& pair : myunorderedmultimap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
}
// 演示 hash_map 的使用
void testhashmap() {
    __gnu_cxx::hash_map<int, std::string> myhashmap;
    myhashmap[1] = "apple";
    myhashmap[2] = "banana";
    myhashmap[1] = "cherry";  // 键 1 重复,会覆盖原有的值
    std::cout << "\nhash_map:" << std::endl;
    for (const auto& pair : myhashmap) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }
}
int main() {
    teststdmap();
    testunorderedmap();
    testmultimap();
    testunorderedmultimap();
    testhashmap();
    return 0;
}

代码解释

  • teststdmap 函数演示了 std::map 的使用,插入重复键的元素会覆盖原有的值,元素按照键的升序排列。
  • testunorderedmap 函数演示了 std::unordered_map 的使用,插入重复键的元素也会覆盖原有的值,元素没有特定的顺序。
  • testmultimap 函数演示了 std::multimap 的使用,允许插入重复键的元素,元素按照键的升序排列。
  • testunorderedmultimap 函数演示了 std::unordered_multimap 的使用,允许插入重复键的元素,元素没有特定的顺序。
  • testhashmap 函数演示了 hash_map 的使用,插入重复键的元素会覆盖原有的值,元素没有特定的顺序。

需要注意的是,hash_map 不是标准 c++ 的一部分,如果你使用的编译器不支持 ext/hash_map 头文件,代码可能无法编译。建议优先使用标准的 std::unordered_map

到此这篇关于c++ 各种map对比的文章就介绍到这了,更多相关c++ map对比内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com