¿Cómo intercambiar claves con valores de un mapa en C++?

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:
    1. Usando un par de vectores, recorre el mapa dado
    2. push_back los valores intercambiados en el par de vectores
    3. ordenar el par de vectores en orden ascendente
    4. 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
    

Publicación traducida automáticamente

Artículo escrito por Blinkii y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *