参考来源:C++ primer 中文版第5版 P626。
1.举个例子:为标准库hash模板定义一个特例化版本,可以用它来将Sales_data对象保存在无序容器中。
默认情况下,无序容器使用hash<key_type>来组织元素。
为了让我们自己的数据类型也能使用这种默认组织方式吗,必须定义hash模板的一个特例化模板。
一个特例化hash类必须定义:
(1) 一个重载的调用运算符,它接受一个容器关键字类型的对象,返回一个size_t。
(2)两个类型成员,result_type和argument_type,分别调用运算符的返回类型和参数类型。
(3)默认构造函数和拷贝赋值运算符。
2. 我们可以向命名空间添加成员,首先,必须打开命名空间。
//打开命名空间,以便特例化std::hash namespace std { }
下面的代码定义了能处理Sales_data 的特例化hash版本。
//打开std命名空间,以便特例化std::hash namespace std { template <> //定义一个特例化版本,模板参数为Sales_data struct hash<Sales_data> { //用来散列一个无序容器必须要定义以下类型 typedef size_t result_type; typedef Sales_data argument_type; size_t operator() (const Sales_data& s) const; //我们的类使用合成的拷贝控制成员 }; size_t hash<Sales_data> :: operator() (const Sales_data & s) const { return hash<string>() (s.bookNo) ^ hash<unsigned>(s.units_sold) ^ hash<double> (s.revenue); } } //关闭std命名空间
原文地址:https://www.cnblogs.com/Shinered/p/9190590.html
时间: 2024-10-11 04:18:18