标签:目标 初始化 重复元素 同步 ace bool fir tar printf
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\n"); else printf("No\n"); } } return 0; }
本题代码参考https://blog.csdn.net/weixin_43550608/article/details/107722473
标签:目标 初始化 重复元素 同步 ace bool fir tar printf
原文地址:https://www.cnblogs.com/theshorekind/p/14399843.html