#include <iostream>
#include <string>
#include <functional>
#include <tuple>
#include <utility>
#include <unordered_map>
typedef std::tuple<std::string,int,char> xkey_t;
struct key_hash : public std::unary_function<xkey_t, std::size_t>
{
std::size_t operator()(const xkey_t& k) const
{
return std::get<0>(k)[0] ^ std::get<1>(k) ^ std::get<2>(k);
}
};
struct key_equal : public std::binary_function<xkey_t, xkey_t, bool>
{
bool operator()(const xkey_t& v0, const xkey_t& v1) const
{
return (
std::get<0>(v0) == std::get<0>(v1) &&
std::get<1>(v0) == std::get<1>(v1) &&
std::get<2>(v0) == std::get<2>(v1)
);
}
};
struct data
{
std::string x;
};
typedef std::unordered_map<xkey_t,data,key_hash,key_equal> map_t;
int main()
{
map_t m;
data d;
d.x = "test data";
m[std::make_tuple("abc",1,'X')] = d;
auto itr = m.find(std::make_tuple(std::string("abc"),1,'X'));
if (m.end() != itr)
{
std::cout << "x: " << itr->second.x;
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8ZnVuY3Rpb25hbD4KI2luY2x1ZGUgPHR1cGxlPgojaW5jbHVkZSA8dXRpbGl0eT4KI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CgoKCnR5cGVkZWYgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZyxpbnQsY2hhcj4geGtleV90OwoKc3RydWN0IGtleV9oYXNoIDogcHVibGljIHN0ZDo6dW5hcnlfZnVuY3Rpb248eGtleV90LCBzdGQ6OnNpemVfdD4KewogICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHhrZXlfdCYgaykgY29uc3QKICAgewogICAgICByZXR1cm4gc3RkOjpnZXQ8MD4oaylbMF0gXiBzdGQ6OmdldDwxPihrKSBeIHN0ZDo6Z2V0PDI+KGspOwogICB9Cn07CgpzdHJ1Y3Qga2V5X2VxdWFsIDogcHVibGljIHN0ZDo6YmluYXJ5X2Z1bmN0aW9uPHhrZXlfdCwgeGtleV90LCBib29sPgp7CiAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCB4a2V5X3QmIHYwLCBjb25zdCB4a2V5X3QmIHYxKSBjb25zdAogICB7CiAgICAgIHJldHVybiAoCiAgICAgICAgICAgICAgIHN0ZDo6Z2V0PDA+KHYwKSA9PSBzdGQ6OmdldDwwPih2MSkgJiYKICAgICAgICAgICAgICAgc3RkOjpnZXQ8MT4odjApID09IHN0ZDo6Z2V0PDE+KHYxKSAmJgogICAgICAgICAgICAgICBzdGQ6OmdldDwyPih2MCkgPT0gc3RkOjpnZXQ8Mj4odjEpCiAgICAgICAgICAgICApOwogICB9Cn07CgpzdHJ1Y3QgZGF0YQp7CiAgIHN0ZDo6c3RyaW5nIHg7Cn07Cgp0eXBlZGVmIHN0ZDo6dW5vcmRlcmVkX21hcDx4a2V5X3QsZGF0YSxrZXlfaGFzaCxrZXlfZXF1YWw+IG1hcF90OwoKCmludCBtYWluKCkKewogICBtYXBfdCBtOwogICBkYXRhIGQ7CiAgIGQueCA9ICJ0ZXN0IGRhdGEiOwoKICAgbVtzdGQ6Om1ha2VfdHVwbGUoImFiYyIsMSwnWCcpXSA9IGQ7CgogICBhdXRvIGl0ciA9IG0uZmluZChzdGQ6Om1ha2VfdHVwbGUoc3RkOjpzdHJpbmcoImFiYyIpLDEsJ1gnKSk7CgogICBpZiAobS5lbmQoKSAhPSBpdHIpCiAgIHsKICAgICAgc3RkOjpjb3V0IDw8ICJ4OiAiIDw8IGl0ci0+c2Vjb25kLng7CiAgIH0KCiAgIHJldHVybiAwOwp9