首页 > 其他分享 >stl中迭代器的删除

stl中迭代器的删除

时间:2023-12-03 20:38:02浏览次数:46  
标签:迭代 删除 stl ++ int ans it2

Z1584. noip题海战

Description
某校举行了k场集训,集训有两种方式:比赛和训练

对于每场比赛,他要保证所出的所有试题,对于所有学生来说,都是从来没有做过的

而对于每场训练,他要保证所出的所有题都被每一个参赛学生做过。

Format
Input
第一行2个正整数n和m,表示学生数和试题总数

第2~n+1行,先是1个正整数Q,接下来的Q个整数表示第i个学生的做题记录(可能重复做同一道题)

第n+2行,1个正整数k,表示要举行的比赛和训练总数

接下来的k行,每行的第一个正整数type表示是训练或比赛(1为训练,0为比赛)。

第2个数K表示参赛学生数,然后K个正整数表示参赛学生编号,每一行中的两个数之间有一个空格。

N<=100

M<=1000

K<=1000

Output
共k行,每行表示本次训练或比赛可选的题目(由小到大排序,中间用一个空格隔开,如果没有输出一个空行)。

Samples
输入数据 1
5 10
2 3 7
1 3
2 4 7
3 3 6 10
7 1 2 3 4 7 8 9
6
0 3 3 4 5
0 3 1 3 4
1 2 1 3
0 1 5
1 1 2
1 2 3 5
输出数据 1
5
1 2 5 8 9
7
5 6 10
3
4 7

 

Sol:

STL中迭代器的删除要非常小心,特别是在一边遍历一边删除的时候

例如要删除it这个迭代器

应该先把它的地址记下来....it2=it;

然后让it进行移动,it++

然后删除it2

 

另一个方法是

将要删除的迭代器地址记下来,放到一个迭代器数组中

当查找工作弄完了后,再一个个删除。

#include <bits/stdc++.h>
using namespace std;
const int N=1e3+10;
int n,m,x,k,num,type;
set<int>s[N],quanji,ans;
set<int>::iterator it,it2;
int main()
{
    ios::sync_with_stdio(false);
    cin>>n>>m;
    for(int i=1;i<=n;i++) 
	{
        cin>>num;
        for(int j=1;j<=num;j++)
		{
            cin>>x;//选手i做过的题号为x(题目必须去重)
            s[i].insert(x);
        }
    }
    for(int i=1;i<=m;i++)
        quanji.insert(i);//预处理全集
    cin>>k;
    while(k--){
        cin>>type>>num;
        ans=quanji;//两个set之间可以用等于号赋值
        if(type==0){//比赛,他要保证所出的题都没有被任何一个参赛学生做过
            for(int i=1;i<=num;i++){
                cin>>x;//选手编号为x
                it=ans.begin();
                while(it!=ans.end())
				{
                    if(s[x].count(*it))
                    {
					   it2=it;
					   it++;
					   ans.erase(it2);//筛掉选手x做过的所有题
					   
                    }
					else 
					      it++;
                }
            }
        }
        else{//训练,他要保证所出的题都被每一个参赛学生做过
            for(int i=1;i<=num;i++){
                cin>>x;//选手编号为x
                for(it=ans.begin();it!=ans.end();){
                    if(!s[x].count(*it))ans.erase(it++);//筛掉选手x没做过的所有题
                    else it++;
                }
            }
        }
        for(it=ans.begin();it!=ans.end();it++)
            printf("%d ",*it);
        printf("\n");
    }
    return 0;
}

  

标签:迭代,删除,stl,++,int,ans,it2
From: https://www.cnblogs.com/cutemush/p/17873674.html

相关文章

  • python 解压可迭代对象赋值给多个变量
    1.2解压可迭代对象赋值给多个变量问题如果一个可迭代对象的元素个数超过变量个数时,会抛出一个ValueError。那么怎样才能从这个可迭代对象中解压出N个元素出来?解决方案Python的星号表达式可以用来解决这个问题。比如,你在学习一门课程,在学期末的时候,你想统计下家庭作业......
  • 如何做到只隐藏表格中的0值,而不是删除?
    1职场实例小伙伴们大家好,今天我们来解决一个公众号后台粉丝留言的Excel问题咨询,这个问题是关于Excel数字显示的问题:在Excel中如何做到只隐藏表格中的0值,而不是删除0值呢?这样无论是手动输入0值或公式函数计算结果等于0,都不会显示。并且随着计算结果的变动而实时更新隐藏结果。如果只......
  • O(1) 时间插入、删除和获取随机元素
    O(1)时间插入、删除和获取随机元素难度:简单|中等√|困难-------------------用时:18分钟(第一次)-------------------作题日期:2023-12-03ps:本人理解有限,以下是自我理解,官方和大佬有更完整和详细的解析!!!题目描述题目描述实现RandomizedSet类:Randomi......
  • Leetcode刷题day4-链表.交换.删除.相交.环
    24.两两交换链表中的节点24.两两交换链表中的节点-力扣(LeetCode)给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题(只能进行节点交换)。示例1:输入:head=[1,2,3,4]输出:[2,1,4,3]示例2:输入:head=[]输出:[......
  • 代码随想录算法训练营第四天 | 24. 两两交换链表中的节点 19.删除链表的倒数第N个节
    LeetCode24.两两交换链表中的节点题目链接:LeetCode24思路:交换结点前将cur后第一个结点和第三个结点进行保存,然后修改cur指向头节点后再修改头节点后的结点classSolution{public:ListNode*swapPairs(ListNode*head){ListNode*dummyHead=newListNo......
  • 在OI类竞赛中经常使用的C++STL模板类
    vector变长数组vector的初始化vector<int>a;//定义一个空的vector,且元素类型为intvector<int>a(n);//定义一个长度为n,元素类型为int的vector,且每个元素都是0vector<int>a(n,x);//定义一个长度为n,元素类型为int,且每个元素都是x的vectorvector<int>b(a);//定义一......
  • 怎么删除磁盘里面的raid?
    要删除已配置为RAID1的sdb磁盘阵列,您可以按照以下步骤进行操作:首先,确保您有管理员权限或root权限来执行这些操作。检查磁盘阵列的状态。运行以下命令来获取RAID1的详细信息:mdadm--detail/dev/md0这将显示有关RAID1的详细信息,包括它的状态、组件磁盘和其它相关信息。3.......
  • 金蝶云星空表单插件单据体批量删除,序号自增
    一、字段标识说明单据体标识:FEntity序号标识:Seq物料标识:F_XXXX_MaterialId【一键删除】操作标识:CleanEmptyEntity 二、表单插件 三、获取单据体数据包//获取单据体,为空提示操作失败varentityD=this.View.Model.DataObject["FEntity"]asDynamicObjectCollection;i......
  • 像使用stl一样使用线段树 ——AtCoder Library(转载https://zhuanlan.zhihu.com/p/459
    地址:https://zhuanlan.zhihu.com/p/459579152 我这里翻译一下官方的文档。首先需要满足几个性质。(注意 ∗ 是个操作,不是单纯的一个乘号)1)操作满足结合律即 (a∗b)∗c=a∗(b∗c)2)操作需要有个幺元(基本元/单位元)a∗e=e∗a=a如果你有这个一个序列S,长度为N ,接下......
  • Mybatis-plus逻辑删除
    转载自:www.javaman.cn1、application.yml配置mybatis-plus:表示这是MyBatis-Plus的配置部分。global-config:全局配置。db-config:数据库相关配置。logic-delete-field:指定逻辑删除的字段名。在这里,指定的字段名是deleted。这意味着,当你调用MyBatis-Plus的逻辑......