美文网首页
如何在关联容器中使用自定义类型

如何在关联容器中使用自定义类型

作者: 琼蘂无徵朝霞难挹 | 来源:发表于2019-08-18 19:29 被阅读0次

0.自定义类型需要满足的条件

我们需要为自定义类型Key实现一个Function Object,他需要遵守以下条件:

  1. 返回类型为std::size_t
  2. 接受单个参数,参数类型为Key,一般我会习惯使用const Key& key
  3. 他是一个常量成员函数
  4. 他不会抛出异常
  5. 对于相同的Key,我们需要返回相同的值;对于不同的Key,我们需要尽量减小collision的发生

听上去很多要求,其实很简单,我们有两种方法来实现以上要求,下面一一阐述。

1.std::hash的template specialization

我们选择std::pair<std::string,int>作为哈希表的Key

namespace std{
    template <>
    struct hash<std::pair<std::string,int >>{
        std::size_t operator()(const std::pair<std::string, int>& p)const noexcept {
            return std::hash<std::string>()(p.first)^std::hash<int>()(p.second);
        }
    };
}

接下来我们就可以直接使用了

class UserDefinedHash{
public:
    UserDefinedHash(){
    }
    void addData(const std::pair<std::string,int>& key,int val){
        templateSpecilization[key]=val;
    }
    int showData(const std::pair<std::string,int>& key){
        auto re=templateSpecilization.find(key);
        if(re != templateSpecilization.end())
            return templateSpecilization.at(key);
        return -1;
    }

private:
    std::unordered_map<std::pair<std::string,int>,int> templateSpecilization;
};

2.使用自定义Function Object

struct MyHash{
    std::size_t operator()(const std::pair<int,int>& p) const noexcept {
        return std::hash<int>()(p.first)^std::hash<int>()(p.second);
    }
};

在使用时,制定std::unordered_map的第三个参数为MyHash即可

class UserDefinedHash{
public:
    UserDefinedHash(){
    }
    void addData(const std::pair<int,int>& key,int val){
        functor[key]=val;
    }
private:
    std::unordered_map<std::pair<int,int>,int,MyHash> functor;
};

3.其他的思考

在选择哈希函数时,上面第二个例子其实并不好,因为当Key{1,1}{n,n}时,返回的哈希经过XOR运算,结果都是一样的,所以我们在选择哈希函数时最好慎重考虑,避免一些明显的错误,如果有条件可以使用boost::hash_combine.

相关文章

  • 第11章:关联容器

    1. 使用关联容器 2. 关联容器概述2.1 定义关联容器2.2 关键字类型的要求2.3 pair类型 3. 关联...

  • 如何在关联容器中使用自定义类型

    0.自定义类型需要满足的条件 我们需要为自定义类型Key实现一个Function Object,他需要遵守以下条件...

  • 第11章 关联容器

    关联容器分类:set还是map、关键字是否重复、关键字是否有序。 11.1 使用关联容器 map类型通常被称为关联...

  • Associations(关联)

    Associations(关联) 本章节描述sequelize中不同关联类型,这里有4种类型的关联可以使用。 Be...

  • Objective-C 使用下标访问自定义类型的属性

    Objective-C 使用下标访问自定义类型的属性 OC容器类 在Objective-C中,可以通过下标来访问数...

  • C++---CHAPTER 11: ASSOCIATIVE-CO

    小结 关联容器通过关键字查找和提取元素。对关键字的使用将关联容器与顺序容器区分开来,顺序容器中是通过位置访问元素的...

  • GeekBand STL与泛型编程 -- 2

    1. 关联容器 关联容器与顺序容器有着根本的不同:关联容器中的元素是按照关键字来保存和访问的。与之相对,顺序容器中...

  • 容器类型:集合

    容器类型:集合 标签的容器 “标签袋” 通过改造字典类型,去掉关联数据值,只留下标签的新容器类型 集合是不重复元素...

  • UI定制组件属性说明书

    组件类型 组件详情说明 父类容器:组件在模型里面使用自关联的方法实现, 一个容器也是组件。 文本输入框: 最基本的...

  • xml方式自定义实现Ioc容器

    @[TOC] xml方式自定义实现Ioc容器 使用xml实现自定义简单的Ioc容器 前言 平时开发过程中,我们都是...

网友评论

      本文标题:如何在关联容器中使用自定义类型

      本文链接:https://www.haomeiwen.com/subject/vykdsctx.html