博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hash_map使用自定义类型做主键
阅读量:5832 次
发布时间:2019-06-18

本文共 3345 字,大约阅读时间需要 11 分钟。

  hot3.png

unordered_set

unordered_map

template < class Key,                                    // unordered_map::key_type           class T,                                      // unordered_map::mapped_type           class Hash = hash
,                       // unordered_map::hasher           class Pred = equal_to
,                   // unordered_map::key_equal           class Alloc = allocator< pair
 >  // unordered_map::allocator_type           > class unordered_map;

方法1:

class InnerP2PString;

typedef std::tr1::shared_ptr<InnerP2PString> P2PString;

class InnerP2PString {

public:

  InnerP2PString(const uint8_t *val, uint16_t len);

  InnerP2PString(const std::string &val);

  ~InnerP2PString();

  std::string val_;

  uint32_t use_times_;

};

typedef std::tr1::unordered_set<P2PString> FileMap;

typedef std::tr1::unordered_map<P2PString, uint32_t> FileTracks;

现在使用的类是P2PString,作为hash_map主键,需要重载一下操作符

namespace std {

  namespace tr1 {

    template<>

    struct hash<P2PString>

      : public std::unary_function<std::string, std::size_t> {

      std::size_t

      operator()(const P2PString& s) const {

        // return Fnv_hash<>::hash((char*)s->val_.data(), s->val_.length()); 

        const char* first = s->val_.data();

        std::size_t length = s->val_.length();

        std::size_t result = static_cast<std::size_t>(14695981039346656037ULL);

        for (; length > 0; --length) {

          result ^= (std::size_t)*first++;

          result *= 1099511628211ULL;

        }

        return result;

      }

    };

  }

  

  template <>

  struct equal_to<P2PString> : public binary_function<P2PString, P2PString, bool>

  {

    bool

    operator()(const P2PString& __x, const P2PString& __y) const

    { return __x->val_ == __y->val_; }

  };

  template <>

  struct less<P2PString> : public binary_function<P2PString, P2PString, bool>

  {

    bool

    operator()(const P2PString& __x, const P2PString& __y) const

    { return __x->val_ < __y->val_; }

  };

}

方法2:

struct KeyPidInfo

{
char key[32];
int pid;
    bool operator<(const KeyPidInfo &keyPid) const
    {
       int flag = strcmp(this->key, keyPid.key);
           return (flag < 0) || 
                   ((flag == 0) && (this->pid < keyPid.pid));
    }
};

struct Hash_KeyPidInfo

    size_t operator()(const KeyPidInfo &keyPidInfo) const
    { 
       char tmp[42];
       int len = strlen(keyPidInfo.key);
       strcpy(tmp, keyPidInfo.key);
       string pid;
       pid = lexical_cast<string>(keyPidInfo.pid);
       strcpy(tmp + len, pid.c_str());
       hash<char *> ht;//直接用了已经提供的hah函数,没有自己编写hash
       return ht(tmp); 
    }
};

struct Equal_KeyPidInfo

{
    bool operator()(const KeyPidInfo &left, const KeyPidInfo &right) const
    {
        return (strcmp(left.key, right.key) == 0) && (left.pid == right.pid);
    }
};

用的时候这样定义:

unordered_map<KeyPidInfo, int, Hash_KeyPidInfo, Equal_KeyPidInfo> valueMap;

备注:

class Thing {

public:

bool operator== (const Thing&) const;

};

struct Hash_Thing {

// hash function object class for Thing

std::size_t operator() (const Thing& t) const

{ /* compute and return a size_t value using some property of Thing */}

};

unordered_set<Thing, Hash_Thing> uset_of_Things;

std::hash_map

需要定义仿函数结构体

struct StringHashFunc  //hash 函数

{

size_t operator() (const string& str)const

        {

            return __stl_hash_string(str.c_str());

        };

};

struct StrCompare   //判断是否相等, 两个值hash统一位置,需要调用此函数判断主键是否存在

{

    bool operator()(const string& str, const string& str1) const

    {

        return strcmp(str.c_str(), str1.c_str())==0;

    }

};

typedef hash_set<string, StringHashFunc, StrCompare> T_StrEqueHashSet;

转载于:https://my.oschina.net/miffa/blog/213474

你可能感兴趣的文章
解决 ThinkPHP5 无法接收 客户端 Post 传递的 Json 参数
查看>>
ASMFD (ASM Filter Driver) Support on OS Platforms (Certification Matrix). (文档 ID 2034681.1)
查看>>
CRM Transaction处理中的权限控制
查看>>
[转]linux创建链接文件的两种方法
查看>>
python ipaddress模块使用
查看>>
文件权限
查看>>
busybox里的僵尸进程为何那么多
查看>>
python debug
查看>>
java 连接数据库之一个完整的函数
查看>>
mysql脚本
查看>>
OllyDBG 入门系列教学--让你瞬间成为破解高手
查看>>
Dubbo点滴(2)之集群容错
查看>>
检测不到兼容的键盘驱动程序
查看>>
listbox用法
查看>>
冲刺第九天 1.10 THU
查看>>
传值方式:ajax技术和普通传值方式
查看>>
Linux-网络连接-(VMware与CentOS)
查看>>
寻找链表相交节点
查看>>
AS3——禁止swf缩放
查看>>
linq 学习笔记之 Linq基本子句
查看>>