У меня есть карта. Я хочу перевернуть ключевое значение, чтобы оно не стало картой. Таким образом, значение первой карты становится ключом второй карты. Как это сделать?
Пример карты:
1 - 1.0
2 - 2.0
После флип
1.0 - 1
2.0 - 2
У меня есть карта. Я хочу перевернуть ключевое значение, чтобы оно не стало картой. Таким образом, значение первой карты становится ключом второй карты. Как это сделать?
Пример карты:
1 - 1.0
2 - 2.0
После флип
1.0 - 1
2.0 - 2
Самый простой способ (что я знаю) - создать новую карту с перевернутыми типами, а также повторить старую и добавить каждую пару ключевых значений в обратном порядке.
Например,
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;
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
template<typename A, typename B>
pair<B,A> flip_pair(const pair<A,B> &p)
{
return pair<B,A>(p.second, p.first);
}
template<typename A, typename B>
map<B,A> flip_map(const map<A,B> &src)
{
map<B,A> dst;
transform(src.begin(), src.end(), inserter(dst, dst.begin()),
flip_pair<A,B>);
return dst;
}
int main(void)
{
std::map<char, int> src;
src['a'] = 10;
src['b'] = 20;
src['c'] = 160;
src['d'] = 110;
src['e'] = 0;
std::map<int, char> dst = flip_map(src);
map<int, char>::iterator it;
for(it=dst.begin(); it!=dst.end(); it++) {
cout << it->first << " : " << it->second << endl;
}
}
for (auto i=normal.begin(); i!=normal.end(); ++i)
flipped[i->second] = i->first;
Если вы хотите искать в обоих направлениях, вы можете использовать Boost.bimap