news 2026/4/27 3:20:02

c++20容器中的透明哈希

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
c++20容器中的透明哈希

一、透明操作符和透明哈希

在C++14引入了透明操作符,而C++20中又引入了透明哈希。它们有一个共同的特征,就是透明。那么它们之间有没有什么联系呢?为什么又引入一个透明哈希呢?一个问题紧跟着一个问题。那咱们就从根儿上盘一盘,把它们的来龙去脉分析一下。这样,就更容易理解透明这个概念以及透明操作符和透明哈希的关系。

二、透明操作符简单说明

透明操作符的本质就是支持异构(透明)的数据操作(当然,必须是库支持的)。由于这种异构的支持,会避免临时对象的创建,也就提高了容器操作的性能。透明操作符针对的是关联容器的特定操作,在库提供的透明类型中,均定义了T::is_transparent标识符(nested type)来表示其是透明类型。其它更详细的可以看一下前面的“透明操作符”相关文章。
透明操作符最明显的就是让开发者可以不用再显式的定义类型从而降低编程的复杂度,再加上临时对象的消除,对性能的提高还是比较明显的。

三、透明哈希

透明操作符是针对有序容器中异构数据操作提供的一种实现。但在STL中,还有无序容器呢?而无序容器中很重要的一个操作就是哈希,所以C++20中就把“黑手”伸向了无序容器中的哈希操作也就是要分析的透明哈希。在STL中std::unordered_set和std::unordered_map等无序容器中,在查找和定位时使用哈希函数可以同样使用类似于透明操作符的方式,这样在保持与C++14兼容的情况下,可以达到类似的效果。不过比较麻烦一些的是,C++20中的透明哈希需要自定义哈希函数。
这样说可能大家不好理解,举一个例子,在std::unordered_map中,虽然其查找的时间复杂度是O(1)。但是如果想通过一个C类型的字符串(const char*)或std::string_view类型的变量来查找以std::string类型为KEY的元素时,标准库会先创建一个临时的std::string对象,然后再查找。
这也意味着虽然查找的本身的动作并没有发生变化,但在准备阶段却进行了意外的对象创建动作。而这也是C++14中透明操作符解决的问题,所以也就可以顺理成章的引入过来,然后把这个问题解决掉。不过,这一引入就到了C++20标准了。
那么为什么在引入这种透明操作之前,C++必须创建一个临时对象呢?其实非常好理解,在C++这种强类型语言中,为了函数操作安全,必须确保操作类型的完全一致(当然也包括隐式的转换)。这在C++中叫做“Homogeneous Lookup”即同质查找。
而在C++20中的无序容器中,为了实现透明哈希,提供了两种基础的透明操作:

  1. 透明哈希器
    一个标准的透明哈希器,需要定义is_transparent标识符;同时,需要提供一个operator()(数据类型转换操作符),它需要支持完全一致的数据类型及可匹配的相关数据类型的参数。这样就可以计算出完全相同的哈希值(KEY)。类似于下面的代码:
structTransparentStr2Hash{using is_transparent=void;//透明标识符// std::stringsize_toperator()(conststd::string&key)const{returnstd::hash<std::string>{}(key);}// std::string_viewsize_toperator()(std::string_view key)const{// C++17:std::hash<std::string_view>returnstd::hash<std::string_view>{}(key);}// const char*size_toperator()(constchar*key)const{returnstd::hash<std::string_view>{}(key);}};
  1. 透明比较器
    透明比较器与透明哈希器的处理方式一致辞,也需要要提供上面两种行为。不过对透明比较器来说,有一个优势,在C++14中提供的透明操作符中提供了std::equal_to这个透明操作符。

至此,在标准库中通过透明机制的操作,为开发者提供了更安全高效的API接口。

四、例程

下面看一下这两个函数的具体的例程:

#include<iostream>#include<string>#include<unordered_map>structTransparentStr2Hash{using is_transparent=void;//透明标识符// std::stringsize_toperator()(conststd::string&key)const{returnstd::hash<std::string>{}(key);}// std::string_viewsize_toperator()(std::string_view key)const{// C++17:std::hash<std::string_view>returnstd::hash<std::string_view>{}(key);}// const char*size_toperator()(constchar*key)const{returnstd::hash<std::string_view>{}(key);}};intmain(){std::unordered_map<std::string,int,TransparentStr2Hash,std::equal_to<>>example={{"one",1},{"two",2},{"three",3}};autoit=example.find("two");//const char*,C++20前需要创建临时string对象if(it!=example.end()){std::cout<<"Found "<<(*it).second<<'\n';}else{std::cout<<"Not found\n";}return0;}

代码只是一个展示,主要是说明C++20标准前的问题。如果大家的环境支持C++20那么可以在“operator()(const char *key)”中下一个断点,如果用C++20调试则断点可以中断,如果用C++17则断点就不会中断了。这也证明了C++20支持了透明哈希。

五、总结

从本文的分析来看,可以很清楚的理解C++标准演进的一种思路。新技术的引进和实践是一步一步的进行的,而不是翻天覆地的革命。其实也很好理解,毕竟标准库已经是一个庞大而稳定的系统,所以其改进必须基于稳妥的前提进行。在连续几个标准中,把相类似的技术引入就是一种非常安全的思路。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/19 2:05:46

对比:传统调试 vs AI辅助解决Selenium会话错误

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个性能对比工具&#xff0c;分别记录&#xff1a;1)人工排查SessionNotCreatedException的平均时间和成功率 2)使用AI辅助工具(如快马平台)的解决时间和成功率。工具应模拟多…

作者头像 李华
网站建设 2026/4/24 10:33:27

使用VLLM部署Qwen3-14B-AWQ量化模型

使用VLLM部署Qwen3-14B-AWQ量化模型 在当前企业对大模型私有化部署需求日益增长的背景下&#xff0c;如何以较低成本实现高性能推理成为关键挑战。通义千问 Qwen3-14B-AWQ 模型结合 vLLM 推理引擎&#xff0c;提供了一条极具性价比的技术路径——仅需一块 RTX 3090 显卡即可运行…

作者头像 李华
网站建设 2026/4/26 8:41:27

AutoGPT API设计与开发实战指南

AutoGPT API设计与开发实战指南 在AI应用从“被动响应”迈向“主动执行”的今天&#xff0c;AutoGPT代表的自主智能体&#xff08;Autonomous Agent&#xff09;正成为下一代系统的核心形态。它不再局限于回答问题&#xff0c;而是能理解目标、规划路径、调用工具、持续迭代&am…

作者头像 李华
网站建设 2026/4/21 14:48:04

Docker部署Qwen3-14B:GPU加速与生产实践

Docker部署Qwen3-14B&#xff1a;GPU加速与生产实践 在AI从实验室走向产线的今天&#xff0c;一个现实问题摆在每个技术团队面前&#xff1a;为什么本地跑得飞快的大模型&#xff0c;一上服务器就“罢工”&#xff1f; 显存爆了、CUDA版本对不上、依赖包冲突……这些问题根本不…

作者头像 李华
网站建设 2026/4/23 18:50:59

无障碍测试WCAG标准实施:构建包容性数字产品的关键路径

在当今数字化时代&#xff0c;软件的可访问性已成为衡量产品成功的重要指标之一。作为软件测试从业者&#xff0c;掌握并实施Web内容无障碍指南&#xff08;WCAG&#xff09;标准&#xff0c;不仅能确保产品符合法规要求&#xff0c;更能推动社会包容性发展。WCAG标准由万维网联…

作者头像 李华
网站建设 2026/4/20 3:07:13

字符串计数匹配 (Python JAVA C++ JS C)

题目描述 给你一个字符串str和整数k&#xff0c;返回满足以下条件的所有子字符串个数&#xff1a; 恰好包含k个字母。数字0-9各出现至少一次。 输入描述 第一行字符串str(1≤ length ≤ 100000),仅包含数字和小写字母第二行为整数k(0 ≤ k ≤100000 ) 输出描述 输出一个整…

作者头像 李华