Я ищу что-то вроде карты «Ключ к ключу» на С++.
Мое намерение заключается в следующем:
- Каждый ключ - как на "левой", так и на "правой" стороне уникален
- Ключ левой стороны можно искать по ключу правой стороны и наоборот
В качестве примера и чтобы сделать мое намерение более ясным, в коде это, вероятно, будет выглядеть так:
key2key<int, string> myMap; // int maps to string, string to int
myMap.insert(0, "zero");
myMap.insert(1, "one");
myMap.insert(2, "two");
myMap.insert(1, "zero"); // would throw an error
myMap.insert(9, "one"); // would throw an error as well
cout << myMap.lookupLeft(1) << endl; // prints "one"
cout << myMap.lookupRight("one") << endl; // prints "1"
Конечно, я мог бы пойти дальше и реализовать что-то подобное самостоятельно, но существует ли что-нибудь там? Я не хочу изобретать велосипед, поэтому, возможно, можно модифицировать или повторно использовать стандартные контейнеры STL или повышать их.
Почему я считаю, что это полезно?
Представьте, что вы читаете файл конфигурации, и вы также хотите написать или внести изменения в этот файл конфигурации. Этот файл конфигурации может содержать некоторые поля, которые внутренне в С++ представлены как безопасные классы перечисления. Использование карты «Ключ к ключу» — это очень легкий генератор и преобразователь типов этих значений.
enum class DebugLevel {error, warning, debug};
const key2key<DebugLevel, string> debugLevelMap = {
{DebugLevel::error, "error"},
{DebugLevel::warning, "warning"},
{DebugLevel::debug, "debug"},
}
DebugLevel foo = debugLevelMap.lookupRight("error");
string bar = debugLevelMap.lookupLeft(DebugLevel::warning);