关于float /double、string类型的hash函数/hash表实现(转)

#include <ext/hash_map>
#include <math.h>
#include <stdio.h>
using namespace std;

#define FLT_EPSILON 1.192093e-007
#define DBL_EPSILON 2.2204460492503131e-016
#define FLOAT_EPSILON(a,b) ( a > b ? fabs(a) * FLT_EPSILON : fabs(b) * FLT_EPSILON)
#define DOUBLE_EPSILON(a,b) ( a > b ? fabs(a) * FLT_EPSILON : fabs(b) * DBL_EPSILON)
#define float_equal(a, b) (fabs((a)-(b)) <= FLOAT_EPSILON(a,b))
#define double_equal(a, b) (fabs((a)-(b)) <= DOUBLE_EPSILON(a,b))
#define INT64_MAX 0x7fffffffffffffffLL

typedef struct
{
    size_t operator()(const double & dValue) const
    {
        int e = 0 ;
        double tmp = dValue;
        if (dValue<0)
        {
            tmp = -dValue;
        }
        e = ceil (log (dValue));
        return size_t(( INT64_MAX+ 1.0) * tmp * exp (-e));
    }
} hash_double; 

typedef struct
{
    bool operator()(const double &value1,const double &value2) const
    {
        return double_equal(value1,value2);
    }
} hash_double_cmp;  

typedef struct
{
    size_t operator()(const string & str) const
    {
        size_t h=0;for(size_t i=0;i<str.length();++i)
        {
            h = ( h<<5 ) - h + str[i];
        }
        return h;
        //return __stl_hash_string(str.c_str());
    }
} hash_string;  

typedef struct
{
    bool operator()(const string &str1,const string &str2) const
    {
        return str1.compare(str2) == 0;
    }
} hash_str_cmp;  

http://blog.csdn.net/templarzq/article/details/7702910

时间: 2024-11-09 09:41:29

关于float /double、string类型的hash函数/hash表实现(转)的相关文章

float double decimal 类型

float:浮点型,含字节数为4,32bit,数值范围为-3.4E38~3.4E38(7个有效位) double:双精度实型,含字节数为8,64bit数值范围-1.7E308~1.7E308(15个有效位) decimal:数字型,128bit,不存在精度损失,常用于银行帐目计算.(28个有效位) float f = 345.98756f;//结果显示为345.9876,只显示7个有效位,对最后一位数四舍五入. double d=345.975423578631442d;//结果显示为345.9

java中Object转换成int或String类型方法

转载: http://www.cnblogs.com/1020182600HENG/p/6137206.html Object obj = getObject(); if(obj instanceof Integer) int value = (Integer)obj; 1 String转换为int类型的方法: 1. Integer.parseInt([String]) 2.Integer.valueOf([String]).intValue(); 3.Integer.decode([Strin

c/c++中关于String类型的思考

首先说明:String并不是一种内置类型,因此任何通过String声明出来的实例都不是一个变量,不同于内置类型因此String仅仅能称之为一种特殊的型别,没错String是一个类类型. 一般来说c语言里面是没有类和对象概念的,那么提供给c语言一个<string.h>头文件是做什么用的呢,如果研究过C++中String的构造那么应该会清楚string的底层依赖的就是内置类型的型别char *指针,所以显而易见开放<string.h>接口库给c语言就是为了处理char *字符串时能够很

string-标准string类型

一.标准string类型 string 类型在<string>的一个库中定义,其定义包含在std命名空间内.所以使用必须包含以下语句:     #include<string>       using  std::string;</span> 二. string对象的定义及初始化 string标准库支持几个构造函数如下:     string s1;//将s1初始化为空串        string s2(s1);//将s2初始化为s1       string s3(

C++中将string类型转换为int, float, double类型 主要通过以下几种方式:

# 方法一: 使用stringstream stringstream在int或float类型转换为string类型的方法中已经介绍过, 这里也能用作将string类型转换为常用的数值类型. Demo: [cpp] view plaincopy #include <iostream> #include <sstream>    //使用stringstream需要引入这个头文件 using namespace std; //模板函数:将string类型变量转换为常用的数值类型(此方法

[C++] string与int, float, double相互转换

参考:http://blog.csdn.net/candadition/article/details/7342380 将string类型转换为int, float, double类型 主要通过以下几种方式: # 方法一: 使用stringstream stringstream在int或float类型转换为string类型的方法中已经介绍过, 这里也能用作将string类型转换为常用的数值类型. Demo: #include <iostream> #include <sstream>

float类型如何转换为string类型

在一些很大的float类型的地方会用科学记数法表示,这个时候如果想完整记录下来,还是得转字符串,这里书写一个float类型转string类型的方法 <?php function float_to_string($float=0) { if(stripos($float, "e")!==false) { $tmp = explode("e",strtolower($float)); $float=bcmul($tmp[0], bcpow(10, $tmp[1])

string 类型的输入操作符 cin 和 getline 函数分别如何处理空白字符?

string用来读取一个word : string 类型的输入操作符 cin 对空白字符的处理:读取并忽略有效字符(非空白字符)之前所有的空白字符,然后读取字符直至再次遇到空白字符,读取终止(该空白字符仍留在输入流中). getline 函数用来读取整行文本,接受两个参数:一个输入流对象和一个 string 对象,例如 getline(cin,line): getline 函数对空白字符的处理:不忽略行开头的空白字符,读取字符直至遇到换行符,读取终止并丢弃换行符(换行符从输入流中去掉但并不存储在

MySQL类型float double decimal的区别

float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值, float和double都是浮点型,而decimal是定点型: MySQL 浮点型和定点型可以用类型名称后加(M,D)来表示, M表示该值的总共长度,D表示小数点后面的长度, M和D又称为精度和标度,如float(7,4)的 可显示为-999.9999, MySQL保存值时进行四舍五入,如果插入999.00009,则结果为999.0001. ☆FLOAT和DOUBLE在不指 定精度时,默认会按照实际的精度来