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++ 文档或参考相关教程。

C++unordered_map是一种关联容器,它提供了一种键值对的映射关系。swap函数unordered_map类的一个成员函数,用于交换两个unordered_map对象的内容。 unordered_map的swap函数的语法如下: ```cpp void swap(unordered_map& other); ``` 其中,other是另一个unordered_map对象,表示要与当前unordered_map对象进行交换的对象。 使用swap函数可以快速高效地交换两个unordered_map对象的内容,而不需要逐个元素进行复制或移动。这在某些情况下可以提高程序的性能。 下面是一个示例代码,展示了如何使用swap函数交换两个unordered_map对象的内容: ```cpp #include <iostream> #include <unordered_map> int main() { std::unordered_map<int, std::string> map1 = {{1, "apple"}, {2, "banana"}}; std::unordered_map<int, std::string> map2 = {{3, "orange"}, {4, "grape"}}; std::cout << "Before swap:" << std::endl; for (const auto& pair : map1) { std::cout << pair.first << ": " << pair.second << std::endl; } std::cout << std::endl; for (const auto& pair : map2) { std::cout << pair.first << ": " << pair.second << std::endl; } std::cout << std::endl; map1.swap(map2); std::cout << "After swap:" << std::endl; for (const auto& pair : map1) { std::cout << pair.first << ": " << pair.second << std::endl; } std::cout << std::endl; for (const auto& pair : map2) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 输出结果: ``` Before swap: 1: apple 2: banana 3: orange 4: grape After swap: 3: orange 4: grape 1: apple 2: banana ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿宋同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值