【map详解】C++怎么实现类似Python中字典的功能?

概述

        要实现类似Python字典的操作,本质上就是实现键值对的存储。

        在C++中,咱们通常会使用 std::unordered_map std::map(建议根据具体需求选择)。这两个容器都提供了键值对的存储机制,但它们在内部实现和性能上有所不同。

0. 使用std::unordered_map

std::unordered_map是基于哈希表的实现,它提供了平均常数时间复杂度的查找、插入和删除操作。但是,最坏情况下的时间复杂度可能会退化到线性时间(尽管这种情况很少见)。

#include <iostream>  
#include <unordered_map>  
#include <string>  
  
int main() {  
    std::unordered_map<std::string, int> dict;  
  
    // 添加键值对  
    dict["apple"] = 100;  
    dict["banana"] = 200;  
  
    // 访问元素  
    std::cout << "apple: " << dict["apple"] << std::endl;  
  
    // 检查键是否存在  
    if (dict.find("orange") == dict.end()) {  
        std::cout << "orange not found" << std::endl;  
    }  
  
    // 遍历map  
    for (const auto& pair : dict) {  
        std::cout << pair.first << ": " << pair.second << std::endl;  
    }  
  
    return 0;  
}

1. 使用std::map

std::map是基于红黑树的实现,它保证了元素按键的升序排列。因此,std::map提供了对数时间复杂度的查找、插入和删除操作。如果你需要按键的顺序进行迭代,那么std::map可能是更好的选择。

#include <iostream>  
#include <map>  
#include <string>  
  
int main() {  
    std::map<std::string, int> dict;  
  
    // 添加键值对  
    dict["apple"] = 100;  
    dict["banana"] = 200;  
  
    // 访问元素  
    std::cout << "banana: " << dict["banana"] << std::endl;  
  
    // 检查键是否存在  
    if (dict.find("orange") == dict.end()) {  
        std::cout << "orange not found" << std::endl;  
    }  
  
    // 遍历map(按键的顺序)  
    for (const auto& pair : dict) {  
        std::cout << pair.first << ": " << pair.second << std::endl;  
    }  
  
    return 0;  
}

选择std::unordered_map还是std::map嘞

  • 如果你需要快速的查找、插入和删除操作,并且不关心元素的顺序,那么std::unordered_map是更好的选择。
  • 如果你需要按键的顺序来迭代元素,那么std::map更适合你的需求。

注意

  • 当使用std::unordered_map时,如果键的类型是自定义类型,你需要提供一个哈希函数和相等比较函数。
  • 访问std::unordered_mapstd::map中不存在的键时,std::map会抛出一个异常(如果你使用的是C++11或更高版本且启用了异常),而std::unordered_map会插入一个默认构造的键值对(如果你使用的是C++17的try_emplace或类似方法,则可以避免这一点)。为了避免这种情况,通常先使用find方法检查键是否存在。

// 注:文章内容参考文心一言的解答

~ 希望对你有帮助 ~

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值