[C++基础知识] unordered_map容器

本文详细介绍了 C++ STL 中的 unordered_map 容器,包括其模板定义及如何使用该容器来存储键值对。通过示例展示了如何创建、添加元素以及遍历 unordered_map 容器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

0. 容器模板定义

unordered_map 容器模板的定义如下所示:
template < class Key,                        //键值对中键的类型
           class T,                          //键值对中值的类型
           class Hash = hash<Key>,           //容器内部存储键值对所用的哈希函数
           class Pred = equal_to<Key>,       //判断各个键值对键相同的规则
           class Alloc = allocator< pair<const Key,T> >  // 指定分配器对象的类型
           > class unordered_map;

unordered_map容器里面的键值对是无序的,容器底层采用的是哈希表存储结构,该结构本身不具有对数据的排序功能,所以此容器内部不会自行对存储的键值对进行排序。这个里面有五个参数,必须显式的给前两个参数赋值。

1. 举例

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
    //创建空 umap 容器
    unordered_map<string, int> umap;
    //向 umap 容器添加新键值对
    umap.emplace("张三", 100);
    umap.emplace("赵四", 95);
    umap.emplace("王五", 99);
    //输出 umap 存储键值对的数量
    cout << "umap size = " << umap.size() << endl;
    cout << "我们班级数学考试前三名如下: " << endl;
    //使用迭代器输出 umap 容器存储的所有键值对
    for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }
    return 0;
}

console运行结果如下:

在这里插入图片描述

2. 再举例

#include <iostream>
#include <string>
#include <unordered_map>
using namespace std;
int main()
{
    //创建空 umap 容器
    unordered_map<string, string> umap;
    //向 umap 容器添加新键值对
    umap.emplace("张三", "34岁");
    umap.emplace("赵四", "37岁");
    umap.emplace("王五","47岁");
    //输出 umap 存储键值对的数量
    cout << "umap size = " << umap.size() << endl;
    cout << "桃园三结义的兄弟,各岁数如下: " << endl;
    //使用迭代器输出 umap 容器存储的所有键值对
    for (auto iter = umap.begin(); iter != umap.end(); ++iter) {
        cout << iter->first << " " << iter->second << endl;
    }
    return 0;
}

在这里插入图片描述

参考链接: http://c.biancheng.net/view/7231.html

<think>嗯,用户问的是unordered_map的size()方法是什么意思。首先,我需要确认自己对这个容器的理解。unordered_mapC++标准库中的关联容器,基于哈希表实现,存储键值对。size()方法通常用来获取容器中元素的数量,但可能用户需要更详细的解释。 然后,我得回忆一下C++文档中的说明。unordered_map的size()成员函数返回的是容器中键值对的数量。和所有标准容器一样,size()的时间复杂度应该是O(1),因为标准要求实现必须保证这一点。这点可能需要提到,特别是用户可能关心性能问题。 接下来,考虑用户可能的背景。如果用户是初学者,可能需要更基础的解释,比如size()的作用和如何使用。如果是更有经验的开发者,可能想知道与其他容器map的区别,或者内部实现的细节。但问题本身比较直接,可能用户只需要基本解释,但最好还是覆盖不同层面。 还要注意unordered_mapmap的区别,虽然问题没直接问,但可能在回答中提到。例如,map是有序的,而unordered_map是无序的,但size()的作用在两者中是一样的,都是返回元素数量。这可以帮助用户将已有的知识迁移过来。 需要给出示例代码,这样用户能直观地看到如何使用size()。例如,插入几个元素后调用size(),输出结果。同时,可能需要提到当元素被删除时,size()会相应减少,这样用户知道它的动态变化。 另外,要注意特殊情况,比如当unordered_map为空时,size()返回0。这可能是一个常见的使用场景,需要特别指出。同时,size()和empty()的关系,可以简单提及,虽然用户没问,但有助于他们了解如何有效使用这些方法。 还要确认是否有其他相关注意事项,比如当插入重复键时,size()不会增加,因为unordered_map的键是唯一的。这可能是一个容易出错的地方,应该在示例中展示,避免用户误解。 总结一下,回答的结构应该是先解释size()的基本含义,然后说明其返回值类型和复杂度,接着给出示例代码,最后补充一些相关的注意事项,比如与其他容器的对比或常见使用场景。这样用户能全面理解这个方法的作用和使用方式。</think>`unordered_map.size()` 是 C++ 标准库中 `std::unordered_map` 容器的成员函数,其作用是 **返回当前容器中存储的键值对(key-value pairs)的数量**。以下是逐步解释: --- ### 1. 基本含义 - **功能**:直接获取容器中已插入且未被删除的元素总数。 - **返回值类型**:`size_type`(无符号整数类型,通常是 `size_t`)。 - **时间复杂度**:O(1)(标准要求必须常数时间复杂度)。 --- ### 2. 示例代码 ```cpp #include <iostream> #include <unordered_map> int main() { std::unordered_map<std::string, int> myMap; // 插入键值对 myMap["apple"] = 10; myMap["banana"] = 20; myMap["cherry"] = 30; // 使用 size() 获取元素数量 std::cout << "Size: " << myMap.size() << std::endl; // 输出 3 // 删除一个元素 myMap.erase("banana"); std::cout << "Size after erase: " << myMap.size() << std::endl; // 输出 2 return 0; } ``` --- ### 3. 关键注意事项 - **空容器**:若容器为空,`size()` 返回 `0`。 - **唯一键值**:若插入重复的键(key),新值会覆盖旧值,但 `size()` 不会增加。 - **与 `empty()` 的区别**: - `size() == 0` 等价于 `empty() == true`,但直接调用 `empty()` 更语义化。 --- ### 4. 对比其他容器 | 容器 | `size()` 行为 | |--------------------|-----------------------------------------| | `std::unordered_map` | 返回唯一键值对数量 | | `std::map` | 同上(但底层为红黑树,有序) | | `std::vector` | 返回动态数组的元素数量 | --- ### 总结 `unordered_map.size()` 是用于快速获取哈希表中当前键值对数量的工具,适用于统计、调试或控制逻辑(例如判断是否需要扩容)。因其常数时间复杂度,可放心高频调用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值