当前位置:首页 C++ > 正文

c++STL中unordered_map和map的区别

作者:野牛程序员:2023-07-15 12:13:30 C++阅读 2824

在C++的STL(Standard Template Library)中,unordered_mapmap是两种常用的关联容器,用于存储键值对。它们之间的主要区别包括以下几点:

  1. 排序:unordered_map是一个哈希表实现,而map是一个红黑树实现。因此,unordered_map不会对键进行排序,而map会根据键的比较规则进行排序。

  2. 访问时间复杂度:unordered_map的平均情况下,对于给定的键,查找、插入和删除操作的时间复杂度为常数O(1)。而map的这些操作的平均时间复杂度为O(log n),其中n是容器中元素的数量。因此,在大多数情况下,unordered_map的操作速度更快。

  3. 内存占用:unordered_map通常比map使用更多的内存,因为它需要维护哈希表的数据结构。另外,由于哈希冲突的存在,unordered_map可能会出现更多的链表或冲突解决机制,进一步增加了内存占用。

  4. 迭代器稳定性:unordered_map的迭代器不保证在插入或删除元素后仍然有效,因为哈希表的结构可能会发生变化。而map的迭代器在插入或删除元素后仍然有效。

  5. 有序性:由于map是根据键的比较规则进行排序的,因此可以方便地遍历键值对按键的顺序进行访问。而unordered_map中的键值对没有特定的顺序。

综上所述,如果你需要快速的查找、插入和删除操作,并且不关心元素的顺序,可以选择unordered_map。如果你需要按键的顺序进行遍历或者希望保持元素的有序性,可以选择map


当我们需要存储学生信息(姓名和年龄)时,我们可以使用unordered_mapmap

使用 unordered_map 的示例:

#include <iostream>
#include <unordered_map>
#include <string>

int main() {
    std::unordered_map<std::string, int> studentAge;

    // 添加学生信息
    studentAge["Alice"] = 20;
    studentAge["Bob"] = 22;
    studentAge["Charlie"] = 19;

    // 查找学生信息
    std::cout << "Alice's age: " << studentAge["Alice"] << std::endl;

    // 遍历学生信息
    for (const auto& pair : studentAge) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

输出结果:

Alice's age: 20
Bob: 22
Charlie: 19

使用 map 的示例:

#include <iostream>
#include <map>
#include <string>

int main() {
    std::map<std::string, int> studentAge;

    // 添加学生信息
    studentAge["Alice"] = 20;
    studentAge["Bob"] = 22;
    studentAge["Charlie"] = 19;

    // 查找学生信息
    std::cout << "Alice's age: " << studentAge["Alice"] << std::endl;

    // 遍历学生信息
    for (const auto& pair : studentAge) {
        std::cout << pair.first << ": " << pair.second << std::endl;
    }

    return 0;
}

输出结果:

Alice's age: 20
Alice: 20
Bob: 22
Charlie: 19

注意,输出结果的顺序在 unordered_map 示例中是不确定的,因为它不保证元素的顺序。而在 map 示例中,键值对按照键的字典顺序进行遍历。


野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
相关推荐

最新推荐

热门点击