¿Cómo recorrer todos los valores para una clave dada en multimapa?

Dado un mapa múltiple y una clave del mapa múltiple, nuestra tarea es simplemente mostrar los pares (clave-valor) de la clave dada. En multimapa podemos tener varios pares (clave-valor) para la misma clave. Supongamos que nuestro mapa múltiple contiene 
 

key     value
1         10
2         20
2         30
2         40
3         50
4         60
4         70

key : 2
key     value
2         20
2         30
2         40

Al igual que en unordered_map en C++ STL, no podemos obtener valores como 
 

int key = 2;
multimap  map;

// insert values in map
cout << "Key : " << key;
cout << "Value : " < second;

Producción : 
 

Key : 2
Value : 20

Debido a que el método anterior solo devolverá la primera aparición de la clave presente, este método falla si hay varios pares (clave-valor) para la misma clave.
Hay dos formas en las que podemos lograr los resultados esperados: 
Método 1 (Recorrido simple) Recorra todo el mapa y siempre que la clave sea igual a la clave dada, mostramos el par clave-valor. 
 

C++

// CPP program to find all values for a
// given key.
#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    multimap <int, int> map;
 
    // insert the values in multimap
    map.insert(make_pair(1, 10));
    map.insert(make_pair(2, 20));
    map.insert(make_pair(2, 30));
    map.insert(make_pair(2, 40));
    map.insert(make_pair(3, 50));
    map.insert(make_pair(4, 60));
    map.insert(make_pair(4, 70));
     
    int key = 2;   
    for (auto itr = map.begin(); itr != map.end(); itr++)   
        if (itr -> first == key)       
            cout << itr -> first << "  "
                 << itr -> second << endl;
 
    return 0;
}

Java

// JAVA program to find all values for a
// given key.
import java.util.*;
 
class GFG
{
 
static class pair
{
    int first, second;
    public pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
public static void main(String[] args)
{
    HashSet <pair> map = new LinkedHashSet<>();
 
    // add the values in multimap
    map.add(new pair(1, 10));
    map.add(new pair(2, 20));
    map.add(new pair(2, 30));
    map.add(new pair(2, 40));
    map.add(new pair(3, 50));
    map.add(new pair(4, 60));
    map.add(new pair(4, 70));
     
    int key = 2;
    for (pair itr : map)
        if (itr.first == key)    
            System.out.println(itr.first+ " "
                + itr.second);
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python program to find all values for a
# given key.
map = []
 
# insert the values in multimap
map.append((1, 10));
map.append((2, 20));
map.append((2, 30));
map.append((2, 40));
map.append((3, 50));
map.append((4, 60));
map.append((4, 70));
 
key = 2;   
for i in map:
    if i[0] == key:
        print(i[0],i[1])
 
# This code is contributed by shubhamsingh10

C#

// C# program to find all values for a
// given key.
using System;
using System.Collections.Generic;
 
class GFG
{
 
class pair
{
    public int first, second;
    public pair(int first, int second)
    {
        this.first = first;
        this.second = second;
    }
}
 
// Driver code
public static void Main(String[] args)
{
    HashSet<pair> map = new HashSet<pair>();
 
    //.Add the values in multimap
    map.Add(new pair(1, 10));
    map.Add(new pair(2, 20));
    map.Add(new pair(2, 30));
    map.Add(new pair(2, 40));
    map.Add(new pair(3, 50));
    map.Add(new pair(4, 60));
    map.Add(new pair(4, 70));
     
    int key = 2;
    foreach (pair itr in map)
        if (itr.first == key)    
            Console.WriteLine(itr.first+ " "
                + itr.second);
}
}
 
// This code is contributed by Rajput-Ji

Javascript

<script>
 
class pair
{
    constructor(first,second)
    {
        this.first=first;
        this.second=second;
    }
}
 
let map = new Set();
// add the values in multimap
map.add(new pair(1, 10));
map.add(new pair(2, 20));
map.add(new pair(2, 30));
map.add(new pair(2, 40));
map.add(new pair(3, 50));
map.add(new pair(4, 60));
map.add(new pair(4, 70));
 
let key = 2;
for (let itr of map.values())
    if (itr.first == key)    
        document.write(itr.first+ " "
                   + itr.second+"<br>");
 
 
// This code is contributed by rag2127
</script>

Producción: 
 

2  20
2  30
2  40

Método 2 (usando la búsqueda binaria) Encuentre el límite inferior y el límite superior para la clave dada y recorra entre ellos. 
lower_bound(key) : devuelve el iterador que apunta al primer elemento que es mayor o 
igual que key. 
upper_bound(key) : devuelve el iterador que apunta al primer elemento que es mayor que key. 
 

key     value
1         10
2         20 <-- lower_bound(20)
2         30
2         40
3         50 <-- upper_bound(20)
4         60
4         70

CPP

#include <bits/stdc++.h>
using namespace std;
 
int main()
{
    multimap <int, int> map;
 
    // insert the values in multimap
    map.insert(make_pair(1, 10));
    map.insert(make_pair(2, 20));
    map.insert(make_pair(2, 30));
    map.insert(make_pair(2, 40));
    map.insert(make_pair(3, 50));
    map.insert(make_pair(4, 60));
    map.insert(make_pair(4, 70));
     
    int key = 2;   
    auto itr1 = map.lower_bound(key);
    auto itr2 = map.upper_bound(key);
     
    while (itr1 != itr2)   
    {
        if (itr1 -> first == key)
           cout << itr1 -> first << "  " 
                << itr1 -> second << endl;       
        itr1++;
    }   
    return 0;
}

Producción: 
 

2  20
2  30
2  40

Publicación traducida automáticamente

Artículo escrito por foreverrookie 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 *