Перевернуть пару "ключ-значение"

У меня есть карта. Я хочу перевернуть ключ-значение, чтобы он не стал картой. Таким образом, в основном значение первой карты становится ключом второй карты. Как мне это сделать?

Пример карты:

1 - 1.0
2 - 2.0

После переворота

1.0 - 1
2.0 - 2

person Richard    schedule 30.11.2011    source источник


Ответы (3)


Самый простой способ (известный мне) — создать новую карту с перевернутыми типами, повторить старую и добавить каждую пару ключ-значение в обратном порядке.

Например,

map<int, float> if_map;

// insert some items into if_map
if_map[1] = 43.11;
if_map[44] = -13421.438;

map<float, int> reversed;

for (map<int, float>::iterator i = if_map.begin(); i != if_map.end(); ++i)
    reversed[i->second] = i->first;
person Seth Carnegie    schedule 30.11.2011
comment
Этот ответ работает, если исходное сопоставление взаимно однозначное. В противном случае этот код приведет к некоторой потере информации. Чтобы решить эту проблему, используйте либо Boost.bimap как @Asha предложено или вернуть результат как vector<pair>. - person rwong; 18.03.2013
comment
Или сохраните полученную перевернутую карту в std::multimap. - person strickli; 26.09.2013

Если вам нужен поиск в обоих направлениях, вы можете использовать Boost.bimap

person Asha    schedule 30.11.2011

person    schedule
comment
Результирующая перевернутая карта должна быть std::multimap, иначе повторяющиеся значения перезапишут ключи, что приведет к потере данных (что может быть желаемым?) - person strickli; 26.09.2013