您的位置:首页 > 其它

无序容器unorder_map使用自定义类型

2017-03-16 22:10 447 查看
      unorder_map使用hash函数和关键字类型的==运算符来组织元素,使用hash函数将元素映射到桶中,为了访问一个元素,容器首先计算元素的哈希值,他指出应该搜索那个桶。默认情况下,无序容器使用关键字类型的==运算符来比较元素,它还使用一个hash<key_tpyr>类型的对象来生成每个元素的哈希值。标准库位内置类型提供了hash模板。包括string类型。但是我们不能直接定义关键类型为自定义类型的无序容器。因此我们需要自己定义该类型一个哈希函数。而且需要自己定义相等函数。

hash函数

struct HashFunc
{
std::size_t operator()(const Node &key) const
{
using std::size_t;
using std::hash;

return ((hash<int>()(key.first)
^ (hash<int>()(key.second) << 1)) >> 1)
^ (hash<int>()(key.third) << 1);
}
};

相等函数
struct EqualKey
{
bool operator () (const Node &lhs, const Node &rhs) const
{
return lhs.first == rhs.first
&& lhs.second == rhs.second
&& lhs.third == rhs.third;
}
};

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

struct Node
{
int first;
int second;
int third;
Node(int i, int j, int k) :first(i), second(j), third(k)
{}
Node(){}
bool operator==(const Node&rhs) const
{
return first == rhs.first && second == rhs.second
&& third == rhs.third;
}
};

struct HashFunc
{
std::size_t operator()(const Node &key) const
{
using std::size_t;
using std::hash;

return ((hash<int>()(key.first)
^ (hash<int>()(key.second) << 1)) >> 1)
^ (hash<int>()(key.third) << 1);
}
};

struct EqualKey { bool operator () (const Node &lhs, const Node &rhs) const { return lhs.first == rhs.first && lhs.second == rhs.second && lhs.third == rhs.third; } };

int main()
{
unordered_map<Node, int, HashFunc,EqualKey> h;
Node key1(1, 2, 3);
h[key1] = 1;
Node key2(3, 4, 45);

cout << h[key1] << endl;
cout << h[key2] << endl;
system("pause");
return 0;
}

#include<iostream>
#include<string>
#include<unordered_map>
using namespace std;

struct HashFunc
{
std::size_t operator()(const vector<int> &key) const
{
using std::size_t;
using std::hash;
size_t res = hash<int>()(key[0]);
for (int i = 1; i < key.size(); ++i)
{
res ^= (hash<int>()(key[i]) << (i % 2));
}
return res;
}
};

struct EqualKey
{
bool operator () (const vector<int> &lhs, const vector<int> &rhs) const
{
for (int i = 0; i < lhs.size(); ++i)
{
if (lhs[i] != rhs[i])
return false;
}
return true;
}
};

int main()
{
unordered_map<vector<int>, int, HashFunc, EqualKey> h;
vector<int> key1 = { 1, 2, 3 };
vector<int> key2 = { 2, 3, 4 };
h[key1] = 3;
cout << h[key1] << endl;
cout << h[key2] << endl;
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: