给定一个多图和多图的一个键,我们的任务是简单地显示给定键的(键-值)对。在多图中,同一键可以有多个(键-值)对。假设我们的多图包含
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等的更多准备工作,请参阅“完整面试准备课程” 。