STL - Unorderedset - 自定义哈希函数

1. hash工具类

hashval.hpp

#ifndef _Core_HashVal_H_
#define _Core_HashVal_H_

#include <functional>

// from boost (functional/hash):
// see http://www.boost.org/doc/libs/1_35_0/doc/html/hash/combine.html
template <typename T>
inline void hash_combine (std::size_t& seed, const T& val)
{
    seed ^= std::hash<T>()(val) + 0x9e3779b9 + (seed<<6) + (seed>>2);
}

// auxiliary generic functions to create a hash value using a seed
template <typename T>
inline void hash_val (std::size_t& seed, const T& val)
{
    hash_combine(seed,val);
}
template <typename T, typename... Types>
inline void hash_val (std::size_t& seed,
                      const T& val, const Types&... args)
{
    hash_combine(seed,val);
    hash_val(seed,args...);
}

// auxiliary generic function to create a hash value out of a heterogeneous list of arguments
template <typename... Types>
inline std::size_t hash_val (const Types&... args)
{
    std::size_t seed = 0;
    hash_val (seed, args...);
    return seed;
}

#endif

2. UnorderedSetTest.cpp

#include <unordered_set>
#include "../../Core/print.hpp"
#include "UnorderedSetTest.h"
#include "../../Core/hashval.hpp"
#include "../../Domain/Models/Customer.h"
#include "../../Domain/Models/CustomerHash.h"
#include "../../Domain/Models/CustomerEqual.h"
#include <string>
#include <iostream>

using namespace std;

void UnorderedSetTest::simpleHashFunc()
{
    // unordered set with own hash function and equivalence criterion
    unordered_set<Customer, CustomerHash, CustomerEqual> custset;

    custset.insert(Customer("arne", "wink", 70));
    custset.insert(Customer("peter", "zhang", 70));
    PRINT_ELEMENTS(custset);

    Customer cust = Customer("arne", "wink", 70);
    if (custset.find(cust) != custset.end())
    {
        cout << "Customer: " << cust << " found!" << endl;
    }
    else
    {
        cout << "Customer: " << cust << " not exists!" << endl;
    }

    Customer cust2 = Customer("arne", "wink2", 70);
    if (custset.find(cust2) != custset.end())
    {
        cout << "Customer: " << cust2 << " found!" << endl;
    }
    else
    {
        cout << "Customer: " << cust2 << " not exists!" << endl;
    }
}

void UnorderedSetTest::run()
{
    printStart("simpleHashFunc()");
    simpleHashFunc();
    printEnd("simpleHashFunc()");
}

3. 运行结果:

---------------- simpleHashFunc(): Run Start ----------------
[arne,wink,70] [peter,zhang,70]
Customer: [arne,wink,70] found!
Customer: [arne,wink2,70] not exists!
---------------- simpleHashFunc(): Run End ----------------

时间: 2024-12-08 06:47:04

STL - Unorderedset - 自定义哈希函数的相关文章

C++ STL中的哈希表 hash_map

在定义hash_map容器的时候,不仅需要指定键和值的类型,还需要指定hash函数和相等函数 (一)hash_map 的hash函数 hash< int>到底是什么样子?看看源码: struct hash<int> { size_t operator()(int __x) const { return __x; } }; 原来是个函数对象.在SGI STL中,提供了以下hash函数: struct hash<char*> struct hash<const cha

[CareerCup] 13.2 Compare Hash Table and STL Map 比较哈希表和Map

13.2 Compare and contrast a hash table and an STL map. How is a hash table implemented? If the number of inputs is small, which data structure options can be used instead of a hash table? 这道题让我们比较哈希表和STL中的map数据结构,在遇到这道题之前,我一直以为map就是c++中的哈希表呢,原来是不同的啊-

算法6-1:哈希函数

在上章节中已经介绍了通过红黑树实现键值对数组的查询操作,复杂度是logN.有没有性能更好的算法呢?答案是有. 基本想法就是计算关键字的哈希值,再通过哈希值直接获取对应的键值. 这种方法的需要解决的问题是: 如何计算哈希值 如何解决哈系冲突 哈希函数 目标 根据对象中的成员变量的值,按照一定的规则计算出一个整数,这个整数就是哈希值. 哈希值最重要的两个属性是: 如果a.equals(b),那么a.hashCode() == b.hashCode() 理想状况下,如果!a.equals(b),那么a

C++ STL 基础及应用(7) 函数对象(仿函数)

把函数作为对象是程序设计的新思维.STL 通过重载类中的 operator() 函数实现函数对象功能,不但可以对容器中的数据进行各种各样的操作,而且能够维护自己的状态.因此,与标准 C 库函数相比,函数对象更为通用. 本章将介绍函数指针的使用.函数对象的定义.引入目的.使用方法,C++98 标准和C++11标准下 STL 内置函数对象的详细介绍.适配器类的使用.包括 bind1st bind2nd not1 not2 mem_fun mem_fun_ref ptr_fun bind ref cr

unordered_map 哈希函数 / 如何防止 unordered_map 被卡

reference : CF上neal的博客 总所周知,set 和 map 由于树的结构,的单次操作是 \(O(\log n)\) 的. 有没有更快的 STL 可以代替它们呢? 在 c++11 里面,unordered_set 和 unordered_map 就可以做到单次操作 \(O(1)\)(基于哈希). 但在 Codeforces 的比赛上面,尽量别用 unoredered_set / unoredered_map. 一是因为 unordered_map 本身自带大常数,有时候跑的甚至没有

Qt自定义sleep延时函数(巧妙的使用时间差,但这样似乎CPU满格,而不是沉睡)

Qt不像VC++的win32/MFC编程那样,提供了现成的sleep函数可供调用.Qt把sleep函数封装在QThread类中.子线程可以调用sleep函数.但是如果用户想在主线程实现延时功能,该怎么办呢?方法是自定义sleep延时函数.通过QDateTime来实现时间差. #include <QDateTime> void MainWindow::sleep(int msec)//自定义Qt延时函数,单位毫秒 { QDateTime last = QDateTime::currentDate

PHP 错误与异常 笔记与总结(8)自定义错误处理函数 set_error_handler()

通过 Set_error_handler() 函数设置用户自定义的错误处理函数. 步骤: ① 创建错误处理函数 ② 设置不同级别调用函数 ③ Set_error_handler() 函数制定接管错误处理—— 如果使用了该函数,程序会绕过标准的 PHP 错误处理. 摘自:php.net mixed set_error_handler ( callable $error_handler [, int $error_types = E_ALL | E_STRICT ] ) 设置一个用户的函数(erro

哈希函数

1,直接地址法,线性函数值为哈希地址.2,数字分析法,关键字是以r为基的数,并且哈希表中可能出现的关键字是实现知道的,则可以取关键字的若干数位组成哈希表.3,平方取中法取关键字的平方后的中间几位为哈希地址.4,折叠法将关键字分割成位数相同的几个部分(最后一部分的位数可以不同),然后取这几部分的叠加和(舍去进位)作为哈希地址,这方法称为折叠法.关键字位数很多,而且关键字中每一位上数字分布大致均匀,可以采用折叠法得到哈希地址.移位叠加,间接叠加.5,除留余数法取关键字被某个不大于哈希表长m的数p除后

Freemaker 自定义指令和函数

自定义函数和指令都可以在前台或者后台进行指定. (一) 自定义指令 使用以下格式调用自定义指令: <@user_def_dir_exp param1=val1 param2=val2 ... paramN=valN/> 定义在前台: <#macro name param1 param2 ... paramN> ... <#nested loopvar1, loopvar2, ..., loopvarN> ... <#return> ... </#mac