• 指纹锁(STL--set)


    set

    其作用是去重,排序。

    set常用操作:

    #include<set>
    //声明一个set容器 
    set<typename> s;//定义,typename为数据类型,假设定义了一个容器s 
    //常用操作: 
        s.insert(x);//将x插入set容器中,并自动排序,去重
        s.find(value);//返回对应值为value的迭代器
        s.size();//获得vector中元素个数
        s.erase(it);//删去迭代器为it的元素
        s.erase(value);//删去值为value的元素
        s.erase(first,last);//删去区间[first,last)内的所有元素
        s.clear();//清空容器s内所有元素 
        s.insert(it,x);//向vector任意迭代器it处插入一个元素x

    使用迭代器遍历容器

    声明迭代器: set<int>:: iterator it; 

    以题 指纹锁 为例

    题目要求实现三个操作,根据题目要求,存储数据的结构中不能存在重复元素,于是想到使用set容器

    代码如下:

    #include<iostream>
    #include<cstdio>
    #include<set>
    #include<string>
    using namespace std;
    
    set<int> s;
    int m,k,num;
    set<int>:: iterator it;
    void add(int num)//添加操作 
    {
        it=s.lower_bound(num);//用于在指定区域内查找不小于(大于等于)目标值的第一个元素 
        if(*it-num<=k)//检查num右边临近的数 
        return ;
        it--;//
        if(num-*it<=k)//检查num左边临近的数 
        return ;
        s.insert(num);//符合,插入 
    }
    
    void del(int num)//删除操作 
    {
        for(it=s.lower_bound(num-k);it!=s.end();)//从第一个符合要求的数,依次删除
        //找到大于等于num-k的第一个数,即是在num-k到num+k区间范围内的第一个数 
        {
            if(*it-num>k)//循环终止条件,区间末尾 
            break;
            int tmp=*it;
            it++;//注意迭代器增加的位置 
            s.erase(tmp);//符合,删除 
        }
    }
    
    bool query(int num)
    {
        it=s.lower_bound(num);//查找 
        if(*it-num<=k)//num右 
        return true;
        it--;
        if(num-*it<=k)//num左 
        return true;
        return false;
    }
    int main()
    {
        ios::sync_with_stdio(false);//取消cin于stdin的同步 
        cin.tie(NULL);//减少输入耗时 
        s.insert(1e8);//初始化数据,迎合代码要求 
        s.insert(-1e8);
        string op;
        cin>>m>>k;
        while(m--)
        {
            cin>>op>>num;
            if(op=="add")
            {
                add(num);
            }
            else if(op=="del")
            {
                del(num);
            }
            else if(op=="query")
            {
                
                int ans=query(num);
                if(ans)
                printf("Yes
    ");
                else
                printf("No
    ");    
            }
        }
        return 0;
    }

    本题代码参考https://blog.csdn.net/weixin_43550608/article/details/107722473

  • 相关阅读:
    转:1分钟解决git clone 速度慢的问题
    进程冻结学习笔记
    RT调度学习笔记(1)
    tracer ftrace笔记(2)——添加与使用
    Regeultor内核文档翻译_学习笔记
    一、Linux cpuidle framework(1)_概述和软件架构
    Python 将私有包自动上传Nexus私服
    Pychram 取消自动添加版本控制
    Python 3DES CBC 模式加密解密
    1588. 所有奇数长度子数组的和
  • 原文地址:https://www.cnblogs.com/theshorekind/p/14399843.html
Copyright © 2020-2023  润新知