Как отметили @Bo Persson и @Sean Cline в комментариях, для этого вам понадобится пользовательская хеш-функция / функтор.
LIVE DEMO
#include <unordered_map>
#include <string>
#include <tuple>
#include <functional>
#include <cstddef>
#include <iostream>
struct myStruct { int x, y; };
using Key = std::pair<std::string, std::string>;
namespace something
{
struct Compare //custom hash function/functor
{
std::size_t operator()(const Key& string_pair) const
{
// just to demonstrate the comparison.
return std::hash<std::string>{}(string_pair.first) ^
std::hash<std::string>{}(string_pair.second);
}
};
}
using myMap = std::unordered_map<Key, myStruct, something::Compare>;
int main()
{
myMap mp =
{
{ { "name1", "name2" },{ 3,4 } },
{ { "aame1", "name2" },{ 8,4 } },
{ std::make_pair("fame1", "name2"),{ 2,4 } }, // or make pair
{ std::make_pair("fame1", "bame2"),{ 1,2 } }
};
for(const auto& it: mp)
{
std::cout << it.first.first << " " << it.first.second << " "
<< it.second.x << " " << it.second.y << std::endl;
}
return 0;
}
Однако каждая симметричная пара будет создавать почти одинаковые хэши, что может вызвать коллизии хешей и, следовательно, снизить производительность.Тем не менее, дополнительные специализации для std::pair
для составления хэшей доступны в boost.hash
Альтернативным решением может быть использование std::map<>
.Там вы также можете указать пользовательскую функцию / функтор для std::pair
, чтобы добиться той же структуры карты.Даже при том, что вам не придется сталкиваться с хеш-коллизиями, это будет хорошо отсортировано, чего вы, возможно, не захотите.
LIVE DEMO
#include <map>
#include <string>
#include <tuple>
#include <iostream>
struct myStruct { int x, y; };
using Key = std::pair<std::string, std::string>;
namespace something
{
struct Compare
{
bool operator()(const Key& lhs, const Key& rhs) const
{
// do the required comparison here
return std::tie(lhs.first, lhs.second) < std::tie(rhs.first, rhs.second);
}
};
}
using myMap = std::map<Key, myStruct, something::Compare>;
Не могли бы вы сказать мне, почему не рекомендуется использовать мой тип данных в std?Мой тип определен в моей собственной программе в любом случае.
Вы не должны делать это под пространством имен std
, потому что это может вызвать UB.Здесь четко определены ситуации / исключения, в которых вы можете расширить пространство имен std
: https://en.cppreference.com/w/cpp/language/extending_std