欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 新闻 > 资讯 > 【map详解】C++怎么实现类似Python中字典的功能?

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

2025/9/23 19:12:12 来源:https://blog.csdn.net/H13420972436/article/details/140548536  浏览:    关键词:【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方法检查键是否存在。

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

~ 希望对你有帮助 ~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词