C++ 具名要求-全库范围的概念 - 函数对象 (FunctionObject) ,对于不同输入值产生相同输出具有很低概率-散列(hash)

此页面中列出的具名要求,是 C++ 标准的规范性文本中使用的具名要求,用于定义标准库的期待。

某些具名要求在 C++20 中正在以概念语言特性进行形式化。在那之前,确保以满足这些要求的模板实参实例化标准库模板是程序员的重担。若不这么做,则可能导致非常复杂的编译器诊断。

全库范围的概念


函数对象 (FunctionObject) ,对于不同输入值产生相同输出具有很低概率

C++ 具名要求: Hash

散列 (Hash) 是函数对象,其输出仅依赖于输入,且当给定不同输入值时,有非常低的概率生成相同输出。

要求

以下情况下,类型 T 满足散列 (Hash)

  • 类型 T 满足函数对象 (FunctionObject) 、可复制构造 (CopyConstructible) 、可析构 (Destructible) ,且

给定

  • Tconst T 类型的值 h,其实参类型是 Key
  • 可转换为 Keyconst Key 的值 k
  • Key 类型的左值表达式 u

下列表达是必须合法且拥有其指定的效果

表达式返回类型要求
h(k)std::size_t返回值在程序执行期间 (C++14 起)仅依赖于 k 的值。所有在程序执行内执行的 (C++14 起) h(k) 的求值对 k 的相同值生成相同结果。

a!=b 的情况下 h(a)==h(b) 的概率应当趋近于 1.0/std::numeric_limits<std::size_t>::max()。

h(u)std::size_t不修改 u

调用示例

#include <iostream>
#include <string>
#include <iterator>
#include <algorithm>
#include <functional>
#include <thread>
#include <typeindex>struct Cell
{int x;int y;Cell() = default;Cell(int a, int b): x(a), y(b) {}bool operator <(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}bool operator ==(const Cell &cell) const{if (x == cell.x){return y < cell.y;}else{return x < cell.x;}}
};std::ostream &operator<<(std::ostream &os, const Cell &cell)
{os << "{" << cell.x << "," << cell.y << "}";return os;
}// std::hash 的自定义特化能注入 namespace std
namespace std
{
/*库函数提供的 hash 的所有显式和部分特化可默认构造 (DefaultConstructible) 、* 可复制赋值 (CopyAssignable) 、可交换 (Swappable) 且可析构 (Destructible) 。* 用户提供的 hash 特化亦必须满足这些要求。*/template<>
struct hash<Cell>
{size_t operator()(const Cell &cell) const{return cell.x + cell.y;}
};
}int main()
{std::cout << "std::hash<Cell> {}(Cell(1, 1)):       "<< std::hash<Cell> {}(Cell(1, 1)) << std::endl;std::cout << "std::hash<Cell> {}(Cell(101, 102)):   "<< std::hash<Cell> {}(Cell(101, 102)) << std::endl;std::cout << "std::hash<std::string> {}(\"GGX\"):     "<< std::hash<std::string> {}("GGX") << std::endl;std::cout << "std::hash<int> {}(123):               "<< std::hash<int> {}(123) << std::endl;std::cout << "std::hash<long> {}(123456):           "<< std::hash<long> {}(123456) << std::endl;std::cout << "std::hash<bool> {}(true):             "<< std::hash<bool> {}(true) << std::endl;std::cout << "std::hash<float> {}(3.14):            "<< std::hash<float> {}(3.14) << std::endl;std::cout << "std::hash<double> {}(3.14):           "<< std::hash<double> {}(3.14) << std::endl;std::cout << "std::hash<std::type_index> {}(typeid(int)):   "<< std::hash<std::type_index> {}(typeid(int)) << std::endl;std::cout << "std::hash<std::type_index> {}(typeid(Cell)):  "<< std::hash<std::type_index> {}(typeid(Cell)) << std::endl;std::cout << "std::hash<std::thread::id> {}(std::this_thread::get_id()):    "<< std::hash<std::thread::id> {}(std::this_thread::get_id()) << std::endl;return 0;
}

输出

std::hash<Cell> {}(Cell(1, 1)):       2
std::hash<Cell> {}(Cell(101, 102)):   203
std::hash<std::string> {}("GGX"):     349164991
std::hash<int> {}(123):               123
std::hash<long> {}(123456):           123456
std::hash<bool> {}(true):             1
std::hash<float> {}(3.14):            584703180
std::hash<double> {}(3.14):           1427109137
std::hash<std::type_index> {}(typeid(int)):   3616029859
std::hash<std::type_index> {}(typeid(Cell)):  1483223384
std::hash<std::thread::id> {}(std::this_thread::get_id()):    1753268367

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/620399.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智能导诊-医院信息化建设标准

智能导诊系统主要依赖于自然语言处理和机器学习等技术。患者可以通过语音、文字等方式描述病情&#xff0c;系统通过自然语言处理技术对病情进行语义分析和理解。随后&#xff0c;机器学习算法对患者的症状和病情进行推理&#xff0c;结合已有的疾病知识库&#xff0c;为患者提…

canvas设置图形图案、文字图案

查看专栏目录 canvas示例教程100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

强化学习应用(二):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

AI大模型学习笔记一

一、商业观点&#xff1a;企业借助大模型获得业务增长可能 二、底层原理&#xff1a;transformer 1&#xff09;备注 ①下面每个步骤都是自回归的过程&#xff08;aotu-regressive&#xff09;&#xff1a;已输出内容的每个字作为输入&#xff0c;一起生成下一个字 ②合起来就…

华为OD机试2024年最新题库(Java)

我是一名软件开发培训机构老师&#xff0c;我的学生已经有上百人通过了华为OD机试&#xff0c;学生们每次考完试&#xff0c;会把题目拿出来一起交流分享。 重要&#xff1a;2024年1月-5月&#xff0c;考的都是OD统一考试&#xff08;C卷&#xff09;&#xff0c;题库已经整理…

8-docker-compose命令操作容器报“no configuration file provided: not found”

1.问题描述 docker-compose命令操作容器时,有时会报出“no configuration file provided: not found”问题 [root@centos79 opt]# docker-compose ps no configuration file provided: not found [root@centos79 opt]# 2.解决方案 最常见的原因是没有在docker-compose.yml文…

Promise高级版 - 通过输出题理解「Promise源码」

1 Promise源码分析 Promise的基本工作原理 Promise构造函数&#xff1a;Promise构造函数接受一个执行器函数作为参数&#xff0c;该函数有两个参数&#xff1a;resolve和reject。在构造函数内部&#xff0c;会创建一个Promise实例&#xff0c;并初始化其状态为pending。 状态…

【GNN2】PyG完成图分类任务,新手入门,保姆级教程

上次讲了如何给节点分类&#xff0c;这次我们来看如何用GNN完成图分类任务&#xff0c;也就是Graph-level的任务。 【GNN 1】PyG实现图神经网络&#xff0c;完成节点分类任务&#xff0c;人话、保姆级教程-CSDN博客 图分类就是以图为单位的分类&#xff0c;举个例子&#xff1…

设备树OF函数操作实验-读取设备节点backlight的整型属性

一. 简介 本文学习使用设备树操作 OF函数&#xff0c;读取设备节点的整型的属性值。 读取设备树文件 imx6ull-14x14-evk.dts 中一个设备节点的信息。这里读取 backlight设备节点的属性值&#xff1a;读取整型的属性。 注意&#xff1a;这里的整型数据都是 32位的数据。而非 …

Open3D 点云等比例缩放(20)

Open3D 点云等比例缩放(20) 一、算法介绍二、算法实现1.代码世人慌慌张张,不过图碎银几两, 偏偏这碎银几两,能解世间万种慌张。 一、算法介绍 实现这样一个功能,沿着中心,按照指定的比例,比如1/2,缩小或者放大点云,保存到新的文件中 二、算法实现 1.代码 import…

小程序基础学习(js混编)

在组件中使用外部js代码实现数据改变 先创建js文件 编写一些组件代码 编写外部js代码 在组件的js中引入外部js 在 app.json中添加路径规则 组件代码 <!--components/my-behavior/my-behavior.wxml--> <view><view>当前计数为{{count}}</view> <v…

操作系统复习 一、二章

操作系统复习 一、二章 文章目录 操作系统复习 一、二章第一章 计算机系统概述处理器中各寄存器的作用指令的执行过程中断存储器层次结构和CacheI/O 通信技术 第二章 操作系统概述大内核微内核大内核微内核 操作系统的定义、目标和功能定义目标和功能 操作系统的发展过程现代操…

Kibana:使用反向地理编码绘制自定义区域地图

Elastic 地图&#xff08;Maps&#xff09;附带预定义区域&#xff0c;可让你通过指标快速可视化区域。 地图还提供了绘制你自己的区域地图的功能。 你可以使用任何您想要的区域数据&#xff0c;只要你的源数据包含相应区域的标识符即可。 但是&#xff0c;当源数据不包含区域…

半监督学习 - 半监督K均值(Semi-Supervised K-Means)

什么是机器学习 半监督K均值&#xff08;Semi-Supervised K-Means&#xff09;是K均值聚类算法的一种扩展&#xff0c;它结合了有标签数据和无标签数据进行聚类。在传统的K均值算法中&#xff0c;所有数据点都是无标签的&#xff0c;而在半监督K均值中&#xff0c;我们允许一部…

RabbitMQ的高可用机制

通过搭建集群保证高可用 RabbitMQ的集群模式&#xff1a; 普通集群&#xff0c;镜像集群&#xff08;开发时用的多&#xff09;&#xff0c;仲裁集群 普通集群&#xff08;标准集群&#xff09;会在各个节点间共享部分数据&#xff08;交换机和队列元信息&#xff09;&#…

最新域名群站开源系统:打造强大网站矩阵,引领SEO优化新潮流!

搭建步骤 第一步&#xff1a;安装PHP和MYSQL服务器环境 对于想要深入了解网站建设的人来说&#xff0c;自己动手安装PHP和MYSQL服务器环境是必不可少的步骤。这将使你能够更好地理解网站的运行机制&#xff0c;同时为后续的网站开发和优化打下坚实基础。 第二步&#xff1a;…

QSpace:Mac上的简洁高效多窗格文件管理器

在Mac用户中&#xff0c;寻找一款能够提升文件管理效率的工具是常见的需求。QSpace&#xff0c;一款专为Mac设计的文件管理器&#xff0c;以其简洁的界面、高效的多窗格布局和丰富的功能&#xff0c;为用户提供了一个全新的文件管理体验。 QSpace&#xff1a;灵活与功能丰富的结…

ImportError: cannot import name ‘Doc‘ from ‘typing_extensions‘

在训练大模型时候出现&#xff1a;ImportError: cannot import name ‘Doc’ from ‘typing_extensions’ 。 问题 原因 安装的typing_extensions版本不正确 解决方法 pip install typing_extensions4.8.0

Python Flask教程

Flask Doc: https://rest-apis-flask.teclado.com/docs/course_intro/what_is_rest_api/Github: https://github.com/tecladocode/rest-apis-flask-python 1. 最简单的应用 最小应用 from flask import Flaskapp Flask(__name__)app.route("/") def hello_world()…

手写webpack的loader

一、概念 帮助webpack将不同类型的文件转换为webpack可识别的模块。 二、Loader执行顺序 分类 pre&#xff1a;前置loadernormal&#xff1a;普通loaderinline&#xff1a;内联loaderpost&#xff1a;后置loader 执行顺序 4类loader的执行顺序为per>normal>inline&…