Dado un mapa , la tarea es intercambiar las Claves de este mapa con sus valores, en C++.
Ejemplos:
Input: map = {'e', 1 }, {'o', 1 }, {'r', 3 }, Output: {1, 'e' }, {1, 'o' }, {3, 'r' },
- Método 1:
- Usando un par de vectores, recorre el mapa dado
- push_back los valores intercambiados en el par de vectores
- ordenar el par de vectores en orden ascendente
- en este caso, no obtendremos la funcionalidad de mapas STL ya que estamos almacenando el resultado en un par de vectores
A continuación se muestra la implementación del enfoque anterior:
// C++ program to swap keys
// and values of a map
// using Vector pair
#include <bits/stdc++.h>
using
namespace
std;
// Function to swap keys and values of a map
// and return a vector pair of the swapped values
template
<
typename
K,
typename
V>
vector<pair<V, K> >
invertMap2(map<K, V>
const
& myMap)
{
vector<pair<V, K> > myvec;
// traverse the map
// and pushback the values -> keys
for
(
auto
const
& pair : myMap) {
myvec.push_back(
make_pair(pair.second,
pair.first));
}
return
myvec;
}
// Function to call the swap operation
void
swap(map<
char
,
int
> char_frequency)
{
cout <<
"Original map:\n\n"
<<
"KEY Value\n"
;
for
(
auto
it
= char_frequency.begin();
it != char_frequency.end();
++it)
cout << it->first <<
" "
<< it->second <<
"\n"
;
// create a vector pair of int, char
// which store the swaped values
vector<pair<
int
,
char
> > freq_char
= invertMap2(char_frequency);
// sort the vector pair to get
// results similar to a map
sort(freq_char.begin(),
freq_char.end(),
[](pair<
int
,
char
>& a,
pair<
int
,
char
>& b) {
if
(a.first != b.first)
return
a.first < b.first;
return
a.second < b.second;
});
cout <<
"\nMap with Keys and"
<<
" Values swapped:\n\n"
<<
"KEY Value\n"
;
for
(
auto
it
= freq_char.begin();
it != freq_char.end();
++it)
cout << it->first <<
" "
<< it->second <<
"\n"
;
}
// Driver code
int
main()
{
// Taking the frequency map of
// GeeksforGeeks as the input map here
string input =
"geeksforgeeks"
;
map<
char
,
int
> char_frequency;
for
(
int
i = 0; i < input.length(); ++i) {
char_frequency[input[i]]++;
}
// Swap the keys with values of this map
swap(char_frequency);
return
0;
}
Producción:Original map: KEY Value e 4 f 1 g 2 k 2 o 1 r 1 s 2 Map with Keys and Values swapped: KEY Value 1 f 1 o 1 r 2 g 2 k 2 s 4 e
- Método 2: Otro enfoque es usar STL MultiMap para almacenar el mapa intercambiado porque Maps no puede tener claves duplicadas. Recorreremos el mapa de entrada e insertaremos los valores intercambiados en el mapa múltiple.
A continuación se muestra la implementación del enfoque anterior:
// C++ program to swap keys
// and values of a map
// using STL MultiMap
#include <bits/stdc++.h>
using
namespace
std;
// Function which swaps keys and
// values of a map and
// returns a multimap.
template
<
typename
K,
typename
V>
multimap<V, K>
invertMap(map<K, V>
const
& myMap)
{
multimap<V, K> myMultiMap;
// Traverse the map and
// pushback the values -> keys
for
(
auto
const
& pair : myMap) {
myMultiMap.insert(
make_pair(pair.second,
pair.first));
}
return
myMultiMap;
}
// Function to call the swap operation
void
swap(map<
char
,
int
> char_frequency)
{
cout <<
"Original map:\n\n"
<<
"KEY Value\n"
;
for
(
auto
it
= char_frequency.begin();
it != char_frequency.end();
++it)
cout << it->first <<
" "
<< it->second <<
"\n"
;
// create a multimap of int, char
multimap<
int
,
char
> freq_char
= invertMap(char_frequency);
cout <<
"\nMap with Keys and"
<<
" Values swapped:\n\n"
<<
"KEY Value\n"
;
for
(
auto
it
= freq_char.begin();
it != freq_char.end();
++it)
cout << it->first <<
" "
<< it->second <<
"\n"
;
}
// Driver code
int
main()
{
// Taking the frequency map of
// GeeksforGeeks as the input map here
string input =
"geeksforgeeks"
;
map<
char
,
int
> char_frequency;
for
(
int
i = 0; i < input.length(); ++i) {
char_frequency[input[i]]++;
}
// Swap the keys with values of this map
swap(char_frequency);
return
0;
}
Producción:Original map: KEY Value e 4 f 1 g 2 k 2 o 1 r 1 s 2 Map with Keys and Values swapped: KEY Value 1 f 1 o 1 r 2 g 2 k 2 s 4 e