一、思路
根据房门编号找到钥匙编号
// s表示共有多少组测试数据
// n表示钥匙串上有多少把钥匙
// key表示钥匙编号,door表示房门编号
// x表示需要打开的房门编号
二、知识点
map
映射,具体包括下列内容:
map、unordered_map
、multimap
概念和特点map、unordered_map
、multimap
的基本操作,比如创建、插入、删除、查找- 范围for循环
1、map 概念
把map称之为映射,就是将一个元素(通常称之为key键)与一个相对应的值(通常称之为value)关联起来,比如说一个学生的姓名(key)有与之对应的成绩(value),它们是一一对应的,就好像一把钥匙开一扇门,在map中键是唯一的,也只有一个唯一的确定的值。
2、区别
在C++中, map 提供了以下三种数据结构,其底层实现以及优劣如下所示:
不同使用场景:
map 和 multimap 的底层实现是红黑树,它的key值存储是有序的,如果需要对键值对进行自定义排序,可以考虑使用map。
unordered_map:底层实现为哈希表,查找速度更快,如果不需要排序而只是快速查找键对应的值,可以考虑使用。
3、使用
1)声明map映射关系
需要指定键的类型和值的类型。
2)插入键值对 key-value
需要使用insert()函数或者使用[]操作符来插入
如果键不存在,[]操作符将会创建一个新的键值对,将其插入到map中,并将值初始化为默认值(对于整数来说,默认值是0)。
3)检查某个键是否存在于map
使用find函数来,它会返回一个迭代器。
如果键存在,迭代器指向该键值对,否则指向map的末尾。
4)遍历map中的所有键值对
使用范围for循环
// 引入unordered_map头文件,包含unordered_map类型
#include <unordered_map>
// 引入map头文件,包含map类型和multimap类型
#include <map>
// 声明一个整数类型映射到整数类型的 无序映射
unordered_map<int, int> uMap;
// 声明一个将字符串映射到整数的`map`,可以这样声明:
map<string, int> myMap;
// 插入键值对
uMap[0] = 10;
uMap[10] = 0;
myMap["math"] = 100;
myMap["english"] = 80;
// 检查某个键是否存在于map中
if (myMap.find("math") != myMap.end()) {
// 键存在
} else {
// 键不存在
}
// 遍历map中所有键值对
for(const pair<int,int>& kv:umap) {
}
// 注意:
// 1、const关键字表示你只能读取容器中的元素,而不能修改它们。
// 2、pair<int, int>定义了kv也就是键值对的数据类型是pair
// C++中的pair类型会将两个不同的值组合成一个单元, 常用于存储键值对
// 创建 pair 时,必须提供两个类型名
// 使用 pair 时通过 first 和 second 成员来访问 pair 中的第一个和第二个元素
// 它的 first 成员存储键,而 second 成员存储值
// 3、& 表示kv是一个引用(reference),而不是值的拷贝
// 如果不使用引用的话,那在每次循环迭代中都会重新创建一个新的pair对象来复制键值对,
// 从而导致不必要的内存分配和拷贝操作。
4、范围for循环
C++11引入了范围for循环,用于更方便地遍历容器中的元素。
这种循环提供了一种简单的方式来迭代容器中的每个元素,而不需要显式地使用迭代器或索引。
范围for循环不会修改容器中的元素,它只用于读取元素。
如果需要修改容器中的元素,需要使用传统的for循环或其他迭代方式。
例如:使用范围for循环遍历一个容器
std::vector<int> numbers = {1, 2, 3, 4, 5};
// 使用范围for循环遍历向量中的元素
for (int num : numbers) {
std::cout << num << " ";
}
// 可以使用auto关键字来让编译器自动推断元素的类型,这样代码会更通用
// 使用auto关键字自动推断元素的类型
for (auto num : numbers) {
std::cout << num << " ";
}
三、代码
#include <iostream>
#include <map>
using namespace std;
int main()
{
int s, key, door, n, x;
cin >> s;
while (s--)
{
map<int, int> MyMap;
cin >> n;
// 将key和对应的door放进MyMap中
while (n--)
{
cin >> key >> door;
MyMap[key] = door;
}
cin >> x;
bool IsFind = false;
// 找钥匙
// 遍历 MyMap
// const 表示kv不可修改, 加 & 避免数值赋值,提高值传递效率
for(const pair<int, int> &kv : MyMap)
{
if(kv.second == x)
{
cout << kv.first <<endl;
IsFind = true;
break;
}
}
if (!IsFind) cout << "Can't open the door." << endl;
}
return 0;
}