C++ map/unordered_map怎么设置自定义哈希函数(Hash)和相等函数(equal_to)以及如何delete键值中指针的内存

1、C++ map/unordered_map怎么设置自定义哈希函数(Hash)和相等函数(equal_to)

使用map或unordered_map,key为自定义类对象或指针时,需要为map提供哈希函数和比较函数,这里举个简单例子说明。

class MyClass {

private:

    std::vector<int> _data;

public:

    MyClass(){}

    std::string GetStr() const {

        std::string str;

        for (auto x: _data ) str += std::to_string(x);

        return str;

    }

    bool operator==(const MyClass &n) const

    {

        return _data == n._data;

    }

};

此时如果要把MyClass作为unordered_map的关键字,就需要指定如下哈希函数,因为类中重载了==符号,所以此时不需要指定Equal函数:

structMyClassHash{

  size_toperator()(constMyClass &cla)const{

        std::string str = cla.GetStr();returnstd::hash()(str);    

}};

则我们的unordered_map如下:

std::unordered_map<MyClass, int, MyClassHash> _mymap;

如果类中没有重载==函数,则修改上述代码如下:

#include <string>

#include <unordered_map>

class MyClass {

private:

    std::vector<int> _data;

public:

    MyClass(){}

    std::string GetStr() const {

        std::string str;

        for (auto x: _data ) str += std::to_string(x);

        return str;

    }

};

struct MyClassHash {

    size_t operator()(const MyClass &cla) const {

        std::string str = cla.GetStr();

        return std::hash<std::string>()(str);

    }

};

struct MyClassEqual {

    bool operator()(const MyClass &c1, const MyClass &c2) const {

        return c1.GetStr() == c2.GetStr();

    }

};

std::unordered_map<MyClass, int, MyClassHash, MyClassEqual> _mymap;

还有一种情况是关键字为指针,这种情况我还没搞懂怎么实现相等函数,等知道了再补上。

2、map/unordered_map的键值为指针,怎么delete

unordered_map<vector<string>, Node*, Hash, Equ> _nodes;

上述代码中Node是自定义类,Hash和Equ分别是自定义的哈希函数和相等函数。

_nodes是一个键值为Node指针的哈希表,不需要_nodes时,需要释放其中指针内存,操作如下。

for (auto it = _nodes.begin(); it != _nodes.end();)

{

    if (it->second == NULL) continue;  // 判断指针不为空,防止重复delete

    delete it->second;

    it->second = NULL;                // 不管什么时候delete指针后都最好将其指向空指针,防止误用该指针或地址块

    it = _nodes.erase(it);            // erase返回当前迭代器的下一个指针

}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 一、C语言基础 1、struct 的内存对齐和填充问题其实只要记住一个概念和三个原则就可以了: 一个概念:自然对齐...
    XDgbh阅读 6,648评论 1 38
  • C++11对模板实例化中连续右尖括号>>的改进 在C++98/03 的泛型编程中,模板实例化有一个很烦琐的地方,那...
    xy_f130阅读 4,490评论 0 0
  • STL 1 STL的诞生 长久以来,软件界一直希望建立一种可重复利用的东西; C++的面向对象和泛型编...
    dreamer11阅读 4,223评论 0 1
  • 网络:https://coolshell.cn/articles/11564.html[https://cools...
    IM后海大鲨鱼阅读 3,582评论 0 0
  • C++ Primer Plus C++,贝尔实验室Bjarne Stroustrup设计的编程语言。C++ Pri...
    gb_QA_log阅读 5,157评论 0 1

友情链接更多精彩内容