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 _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 _mymap;

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

#include

#include

class MyClass {

private:

    std::vector _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()(str);

    }

};

struct MyClassEqual {

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

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

    }

};

std::unordered_map _mymap;

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

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

unordered_map, 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返回当前迭代器的下一个指针

}

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