当前位置: 首页 > article >正文

C++ unordered_map容器所有的函数使用方法

unordered_map 容器

unordered_map 是 C++ 标准库中的一个容器,它提供了基于哈希表的键值对映射。

unordered_map 的主要特点是它提供了平均时间复杂度为 O(1) 的查找、插入和删除操作。以下是 unordered_map 的一些主要成员函数:

构造函数:

  • unordered_map():默认构造函数,创建一个空的 unordered_map。

    unordered_map<int,int> coordinate;
    
  • unordered_map(initializer_list):使用初始化列表创建一个 unordered_map。

    unordered_map<std::string, int> my_map = {
        {"apple", 2},
        {"banana", 3},
        {"orange", 4}
    };
    

需要特别注意的是:当我们初始化一个unordered_map的时候,必须提供关键字类型和值的类型。我们将每个关键字-值对包围在花括号中注意是花括号,不是小括号!!!{key,value}

pair类型的基础知识

  • 因为unordered_map中元素的类型其实是一个pair类型。一个pair类型会保存两个数据成员。我觉得大家如果对pair类型的基础知识不牢固的话,可以去看看我的这篇文章:
  • C++ pair类型详细介绍

迭代器相关:

  • begin():返回指向容器中第一个元素的迭代器。
  • end():返回指向容器中最后一个元素之后的迭代器。
  • cbegin():返回一个指向容器中第一个元素的常量迭代器。
  • cend():返回一个指向容器中最后一个元素之后的常量迭代器。

容量相关:

  • empty():检查容器是否为空。
  • size():返回容器中元素的数量。
  • max_size():返回容器可以容纳的最大元素数量。

访问元素(下标操作)

unordered_map下标运算符接受一个索引(即,一个关键字(key)),获取与此关键字对应的值。
但是,与其他下标运算符不同的是,如果关键字不在unordered_map中,则会为它创建一个对应的关键字然后插入到map中,这个关键字对应的值会进行值初始化。

  • operator[]:通过键访问对应的值,如果键不存在,则插入一个具有默认值的键值对。
  • at():通过键访问对应的值,如果键不存在,则抛出 out_of_range 异常。

修改容器(添加元素,删除元素,清空容器)

添加元素

  • 以下是一个示例,展示了向 unordered_map 中添加元素的几种方式:

    int main() {
    	unordered_map<string, int> data;
        // 方式1: 使用下标运算符[],如果键不存在,则插入新元素
        data["apple"] = 5;
        // 方式2: 使用insert()函数插入一个pair类型的对象
        data.insert(pair<string, int>("banana", 3));
        // 方式3: 使用insert()函数插入一个make_pair()生成的键值对
        data.insert(make_pair("orange", 7));
        // 方式4: 使用insert()函数插入一个初始化列表表示的键值对
        data.insert({"grape", 2});
        // 方式5: 使用emplace()函数直接构造键值对并插入
        data.emplace("pear", 4);
    }
    
  • 在这个示例中,我们展示了向 unordered_map 中添加元素的五种方式:

    1. 使用下标运算符 [] 直接为给定的键分配一个值。如果键不存在,unordered_map 会自动创建一个新元素并将其插入到容器中。
    2. 使用 insert() 函数插入一个 pair 类型的对象。
    3. 使用 insert() 函数插入一个 make_pair() 生成的键值对。
    4. 使用 insert() 函数插入一个初始化列表表示的键值对。
    5. 使用 emplace() 函数直接构造键值对并插入。这种方法可以避免不必要的临时对象创建和拷贝,从而提高性能。
  • 在这个示例中,我们同时展示了这五种方法,并使用范围 for 循环遍历 unordered_map 中的所有元素,输出它们的键和值。

删除一个元素

  • erase():从容器中删除一个键值对。

清空容器

  • clear():清除容器中的所有元素。

查找

  • find():查找具有指定键的元素,并返回指向该元素的迭代器。如果没有找到,则返回指向 end() 的迭代器。
  • count():返回具有指定键的元素数量。

哈希策略

  • load_factor():返回当前的负载因子。
  • max_load_factor():返回或设置最大负载因子。
  • rehash():设置存储桶的数量,以便容纳至少指定数量的元素。
  • reserve():将存储桶的数量设为至少容纳指定数量的元素,不超过最大负载因子。

观察器

  • hash_function():返回当前使用的哈希函数对象。
  • key_eq():返回当前使用的键比较函数对象。

比较运算符

  • operator==:比较两个 unordered_map 是否相等。
  • operator!=:比较两个 unordered_map 是否不相等。

可以用于 unordered_map的非成员函数

这些函数的详细信息和用法可以在 C++ 文档中找到。当然除了这些成员函数之外,C++ 标准库还提供了一些非成员函数,可以用于 unordered_map:

交换:

  • std::swap():交换两个 unordered_map 容器的内容。

分配器相关:

  • std::allocator_traits:提供了一种通用的方式来操作 unordered_map 的分配器。

特化 std::hash:

  • std::hash:为内置类型和用户定义类型提供哈希函数的特化。

特化 std::swap:

  • std::swap:在 std 命名空间中为 unordered_map 提供 swap() 函数的特化。

注意,这些函数和特化可能需要包括 <utility>、<memory> 和 <functional> 等头文件。

在实际使用中,你可能不需要所有这些成员和非成员函数。了解它们的基本用途和功能有助于你更有效地利用 unordered_map。在需要详细了解某个函数时,可以查阅 C++ 文档或参考相关教程。


http://www.kler.cn/a/6357.html

相关文章:

  • 教育行业 UI 设计基础篇:简洁直观的风格打造
  • 操作系统导论读书笔记
  • vscode插件更新特别慢的问题
  • 使用 perf 工具进行性能分析
  • chrome浏览器id值预览后发生改变
  • 容器技术所涉及Linux内核关键技术
  • 【Ruby学习笔记】6.Ruby 注释及判断
  • 剑指 Offer 56 - I. 数组中数字出现的次数
  • Android物理按键事件处理
  • springboot 数据库应用
  • .NET Core 中实现分布式事务的几种方案
  • 理想汽车的雷达在无人陵园内看到鬼?网友:按一下喇叭看会不会聚过来!
  • 基于SpringBoot开发的人事管理系统
  • Python 高级编程(文件操作)
  • TCP / IP 模型
  • AtCoder Beginner Contest 296 (A~D)
  • 虚拟机与主机互传文件
  • 【C++】哈希
  • C++初阶—string类(1)
  • web前端面试题之webpack和其他
  • spring七种事务传递机制及其原理
  • 会C#如何学习Python的几个关键点
  • pytorch安装和测试
  • MyBatis
  • 注册谷歌账户教程--解决注册谷歌账户“此电话号码无法用于进行验证”问题--亲测已解决--谷歌账户注册全流程
  • 【面试】Java并发编程面试题