unordered_map(c++)

std::unordered_map 是 C++ 标准库中提供的一个哈希表容器,具有快速的查找、插入和删除操作。它存储键值对,并且支持基于哈希函数的快速查找,适合用于不需要顺序访问的场景。

常用方法及其详细讲解:

1. insert

  • 功能: 向 unordered_map 中插入一个新的键值对。

  • 语法:

    1
    2
    unordered_map[key] = value; // 直接插入
    unordered_map.insert({key, value}); // 另一种插入方式
  • 返回值:

    • 如果使用 insert,它会返回一个 pair<iterator, bool>,其中 iterator 指向插入的元素,bool 表示插入是否成功(如果键已存在则为 false)。
  • 示例:

    1
    2
    3
    std::unordered_map<int, std::string> umap;
    umap.insert({1, "apple"});
    umap[2] = "banana";

2. find

  • 功能: 查找 unordered_map 中指定键的元素。如果元素存在,返回指向该元素的迭代器;否则,返回 end()

  • 语法:

    1
    iterator find(const key_type& key);
  • 返回值: 返回一个迭代器。如果键不存在,返回 end()

  • 示例:

    1
    2
    3
    4
    5
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    auto it = umap.find(2);
    if (it != umap.end()) {
    std::cout << "Found: " << it->second << std::endl; // 输出: Found: banana
    }

3. erase

  • 功能: 删除 unordered_map 中指定键的元素。

  • 语法:

    1
    2
    3
    void erase(const key_type& key); // 删除指定键的元素
    void erase(iterator pos); // 删除指定位置的元素
    void erase(iterator first, iterator last); // 删除指定范围的元素
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    umap.erase(2); // 删除键为 2 的元素

4. count

  • 功能: 判断指定键是否存在。如果元素存在,返回 1;否则返回 0。

  • 语法:

    1
    size_t count(const key_type& key) const;
  • 示例:

    1
    2
    3
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    std::cout << umap.count(1) << std::endl; // 输出: 1
    std::cout << umap.count(3) << std::endl; // 输出: 0

5. size

  • 功能: 返回 unordered_map 中元素的数量。

  • 语法:

    1
    size_t size() const;
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    std::cout << umap.size() << std::endl; // 输出: 2

6. empty

  • 功能: 判断 unordered_map 是否为空。

  • 语法:

    1
    bool empty() const;
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap;
    std::cout << umap.empty() << std::endl; // 输出: 1 (true)

7. clear

  • 功能: 清空 unordered_map 中的所有元素。

  • 语法:

    1
    void clear();
  • 示例:

    1
    2
    3
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    umap.clear();
    std::cout << umap.size() << std::endl; // 输出: 0

8. bucket_count

  • 功能: 返回哈希表中的桶的数量。哈希表将元素分配到不同的桶中,这个方法可以用来获取桶的数量。

  • 语法:

    1
    size_t bucket_count() const;
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    std::cout << umap.bucket_count() << std::endl;

9. bucket

  • 功能: 返回指定键对应的桶的索引。

  • 语法:

    1
    size_t bucket(const key_type& key) const;
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    std::cout << umap.bucket(1) << std::endl;

10. rehash

  • 功能: 手动调整哈希表的桶大小,以优化性能(可以用于控制哈希表的负载因子)。

  • 语法:

    1
    void rehash(size_t n); // 将桶的数量调整为至少 n
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap;
    umap.rehash(10); // 调整哈希表的桶数量至 10

11. load_factor

  • 功能: 返回当前哈希表的负载因子,负载因子是元素数量与桶数量之比。

  • 语法:

    1
    float load_factor() const;
  • 示例:

    1
    2
    std::unordered_map<int, std::string> umap = {{1, "apple"}, {2, "banana"}};
    std::cout << umap.load_factor() << std::endl;

总结

  • 查找元素: 使用 find 来查找元素,返回迭代器。
  • 插入元素: 使用 insert 或者 operator[] 来插入新元素。
  • 删除元素: 使用 erase 来删除特定键的元素,或者使用 clear 来清空所有元素。
  • 其他操作: count 判断元素是否存在,size 获取元素数量,empty 判断容器是否为空。

unordered_map 适用于需要快速查找而不关心元素顺序的场景,它提供了高效的查找和插入性能。