📜  如何遍历多重映射中给定键的所有值?

📅  最后修改于: 2021-05-30 09:53:23             🧑  作者: Mango

给定一个多图和多图的一个键,我们的任务是简单地显示给定键的(键-值)对。在多图中,同一键可以有多个(键-值)对。假设我们的多图包含

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

就像在C++ STL中的unordered_map中一样,我们无法获取诸如

int key = 2;
multimap  map;

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

输出 :

Key : 2
Value : 20

因为上述方法将仅返回首次出现的键,所以如果同一键有多个(键-值)对,则此方法将失败。

有两种方法可以达到预期的结果:
方法1(简单遍历)遍历整个地图,只要键等于给定键,我们就会显示键值对。

C++
// CPP program to find all values for a 
// given key.
#include 
using namespace std;
  
int main()
{
    multimap  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  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


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 map = new HashSet();
  
    //.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


输出:

2  20
2  30
2  40

方法2(使用二进制搜索)查找给定键的lower_bound和upper_bound并在它们之间遍历。
lower_bound(key):返回指向大于或大于的第一个元素的迭代器
等于键。
upper_bound(key):返回指向大于key的第一个元素的迭代器。

key     value
1         10
2         20 <-- lower_bound(20)
2         30
2         40
3         50 <-- upper_bound(20)
4         60
4         70
#include 
using namespace std;
  
int main()
{
    multimap  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;
}

输出:

2  20
2  30
2  40
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”