c++ std::unordered_set、std::unordered_map、std::unordered_multiset、std::unordered_multimap使用笔记

c++ std::unordered_set、std::unordered_map、std::unordered_multiset、std::unordered_multimap使用笔记

std::unordered_setstd::unordered_mapstd::unordered_multisetstd::unordered_multimap 是 C++ 标准库中的无序关联容器,基于哈希表实现。它们提供了快速的查找、插入和删除操作。

1. std::unordered_set

  • 定义: 存储唯一元素的集合,元素无序。
  • 使用场景: 需要快速查找元素是否存在,且不关心元素的顺序。
  • 简单使用:
    #include <unordered_set>
    #include <iostream>
    
    int main() {
        std::unordered_set<int> uset = {1, 2, 3, 4, 5};
    
        // 插入元素
        uset.insert(6);
    
        // 查找元素
        if (uset.find(3) != uset.end()) {
            std::cout << "3 found in set" << std::endl;
        }
    
        // 删除元素
        uset.erase(2);
    
        // 遍历
        for (const auto& elem : uset) {
            std::cout << elem << " ";
        }
        return 0;
    }
    

2. std::unordered_map

  • 定义: 存储键值对的集合,键唯一,元素无序。
  • 使用场景: 需要快速通过键查找对应的值,且不关心键值对的顺序。
  • 简单使用:
    #include <unordered_map>
    #include <iostream>
    
    int main() {
        std::unordered_map<std::string, int> umap = {{"apple", 1}, {"banana", 2}};
    
        // 插入键值对
        umap["cherry"] = 3;
    
        // 查找键
        if (umap.find("banana") != umap.end()) {
            std::cout << "banana found, value: " << umap["banana"] << std::endl;
        }
    
        // 删除键值对
        umap.erase("apple");
    
        // 遍历
        for (const auto& pair : umap) {
            std::cout << pair.first << ": " << pair.second << std::endl;
        }
        return 0;
    }
    

3. std::unordered_multiset

  • 定义: 存储元素的集合,元素可以重复,元素无序。
  • 使用场景: 需要快速查找元素是否存在,且允许重复元素。
  • 简单使用:
    #include <unordered_set>
    #include <iostream>
    
    int main() {
        std::unordered_multiset<int> umset = {1, 2, 2, 3, 4, 4, 4};
    
        // 插入元素
        umset.insert(5);
    
        // 查找元素
        if (umset.find(2) != umset.end()) {
            std::cout << "2 found in multiset" << std::endl;
        }
    
        // 删除元素
        umset.erase(4);
    
        // 遍历
        for (const auto& elem : umset) {
            std::cout << elem << " ";
        }
        return 0;
    }
    

4. std::unordered_multimap

  • 定义: 存储键值对的集合,键可以重复,元素无序。
  • 使用场景: 需要快速通过键查找对应的值,且允许键重复。
  • 简单使用:
    #include <unordered_map>
    #include <iostream>
    
    int main() {
        std::unordered_multimap<std::string, int> ummap = {{"apple", 1}, {"banana", 2}, {"apple", 3}};
    
        // 插入键值对
        ummap.insert({"cherry", 4});
    
        // 查找键
        auto range = ummap.equal_range("apple");
        for (auto it = range.first; it != range.second; ++it) {
            std::cout << "apple: " << it->second << std::endl;
        }
    
        // 删除键值对
        ummap.erase("banana");
    
        // 遍历
        for (const auto& pair : ummap) {
            std::cout << pair.first << ": " << pair.second << std::endl;
        }
        return 0;
    }
    

优缺点

  • 优点:
    • 快速查找、插入和删除: 平均时间复杂度为 O(1)。
    • 灵活性: 支持自定义哈希函数和键比较函数。
  • 缺点:
    • 无序: 元素存储顺序不确定。
    • 内存开销: 哈希表需要额外的内存来维护哈希桶。
    • 哈希冲突: 哈希函数设计不当可能导致性能下降。

使用场景

  • std::unordered_set: 需要快速检查元素是否存在,且不关心顺序。
  • std::unordered_map: 需要快速通过键查找值,且不关心顺序。
  • std::unordered_multiset: 需要快速检查元素是否存在,且允许重复元素。
  • std::unordered_multimap: 需要快速通过键查找值,且允许键重复。

这些容器在需要高效查找、插入和删除操作的场景中非常有用,尤其是在元素顺序不重要的情况下。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值