📜  门|门CS 2012 |第 31 题(1)

📅  最后修改于: 2023-12-03 15:12:47.455000             🧑  作者: Mango

门|门CS 2012 |第 31 题

这道题是一个典型的模拟题,需要我们根据题目给出的要求模拟实现一个程序。

题目描述

题目要求我们实现一个门禁系统,这个系统有以下几个功能:

  1. 添加一个卡号到白名单中
  2. 从白名单中删除一个卡号
  3. 判断一个卡号是否在白名单中
问题分析

我们可以使用 STL 中的 set 模拟白名单,因为 set 内部是有序的,可以快速地进行插入和删除操作。对于判断是否在白名单中,我们可以利用 set 的 find 函数查找。

我们需要注意的是,C++11 中的 set 有一个新的成员函数 emplace ,它可以直接在 set 中插入元素,并且可以避免多次复制。因此我们可以尽量使用 emplace 而不是 insert 函数。

代码实现
#include <iostream>
#include <set>

using namespace std;

int main()
{
    set<int> whitelist;

    int n;
    cin >> n;

    while (n--)
    {
        string op;
        int card;
        cin >> op >> card;

        if (op[0] == 'i')
        {
            whitelist.emplace(card);
        }
        else if (op[0] == 'd')
        {
            whitelist.erase(card);
        }
        else if (op[0] == 'q')
        {
            auto iter = whitelist.find(card);
            if (iter != whitelist.end())
            {
                cout << "yes\n";
            }
            else
            {
                cout << "no\n";
            }
        }
    }

    return 0;
}

这段代码首先创建了一个 set,然后读入一个数字 n,表示操作次数。接下来在循环中读入每一次的操作和卡号,根据操作类型('i','d','q')进行相应的处理。对于插入操作,使用 emplace 函数插入新元素,对于删除操作,使用 erase 函数删除元素,对于查询操作,使用 find 函数查找元素,如果找到就输出 "yes",否则输出 "no"。

总结

这道题是一个典型的模拟题,我们可以使用 STL 中的 set 来实现白名单,需要注意使用 emplace 而不是 insert 函数。这种模拟题可以帮助我们熟悉 C++ STL 的使用,掌握一些常见的数据结构和算法。