第3关:STL模板之关联容器:集合set的操作详解

做一个精致的利己主义者

//
//  main.cpp
//  step3
//
//  Created by ljpc on 2018/7/24.
//  Copyright © 2018年 ljpc. All rights reserved.
//

#include <iostream>
#include <cstring>
#include <algorithm>
#include <set>
using namespace std;

int main(int argc, const char * argv[]) {
    
    
    // 请在这里补充代码,完成本关任务
    /********* Begin *********/
    // 1.创建一个空的集合st,数据类型为int
    set<int> st;
    
    // 2.读取数据:第一行整数n,后面n行插入或删除操作,并按指定要求输出
    int n,x;
    cin>>n;
    char str[20];
    while(n--){
        scanf("%s %d", str, &x);
if(strcmp(str, "insert")==0){//strcmp函数比较字符串的函数,若相同则返回比0大的数字,相等则返回等于0,反之
            if(st.find(x) == st.end()){//find()方法找到了则返回该元素在集合中的地址,否则返回集合尾地址
                st.insert(x);//说明没找到,就直接插入
            }else {
                printf("%d in set\n",x);//说明找到了
            }
        }
        else if(strcmp(str,"erase")==0){//使出同样的招数在删除阶段
            if(st.find(x)!=st.end()){//在集合中找到x的元素不为尾地址为真
                st.erase(x);//就删除x元素
            }else {
                printf("%d not in set\n",x);//说明x不在集合中
            }
        }

    }
    // 3.遍历集合st,并按指定要求输出在一行输出集合所有元素,中间空格隔开,末尾'\n'
    printf("print set: %d\n", int(st.size()));
     for (set<int>::iterator it=st.begin(); it!=st.end(); it++){//集合的遍历要通过迭代器的方式进行,从首地址开始逐渐指向尾地址;
    if(it==st.begin()){
        printf("%d",*it);
    }else{
        printf(" %d", *it);
    }
     }
     printf("\n");
    // 4.读取数据:整数m以及m次查找操作,并按指定要求输出
    int m;
    scanf("%d",&m);
    while(m--){
        scanf("%s %d",str,&x);
        if(st.find(x)!=st.end()){
            printf("find %d in set\n", x);
        }else{
            printf("find %d not in set\n", x);
        }
    }
    // 5.清空集合st
    st.clear();
    
    /********* End *********/
    printf("%d\n", int(st.size()));
    
    return 0;
}

任务描述

本关任务:仔细阅读下文集合的相关操作,并使用set完成N次插入或删除元素操作,以及集合的遍历和查找等要求。

相关知识

为了完成本关任务,你需要掌握:1.集合的概念,2.插入元素,3.删除元素,4.遍历集合,5.查找元素,6.清空集合。

集合的概念

集合set就是数学上的集合,其中的每个元素没有重复的,但是set中的元素在数据结构中是有序存储的(默认升序),为了高效的实现插入、删除和查找等操作,这与数学上的集合中元素无序性有点区别。

集合set也是STL中的一种标准关联容器,其底层数据结构是基于平衡搜索树(红黑树)实现的,插入删除等操作都是通过迭代器指针实现的,不涉及内存操作,因此效率非常高。

集合set被包含在set头文件中,基本定义方式如下:

  • set<int> st,定义了一个元素类型为int整型的集合st

插入元素

往集合中插入一个元素通过调用insert()方法实现:

 
  1. set<int> st; // 创建一个整型集合st
  2. st.insert(1); // 向st插入一个元素1
  3. st.insert(2); // 向st插入一个元素2

删除元素

集合元素的删除通过调用erase()方法实现,传入的参数可以是待删除的元素,也可以是待删除元素的地址:

 
  1. set<int>::iterator it = st.begin(); // 定义一个迭代器,初始为st的首地址
  2. cout<<*it; // 输出为元素1
  3. st.erase(it); // 删除it指向的元素1
  4. st.erase(2); // 删除元素2

遍历集合

集合的遍历通过迭代器的方式进行,首先让迭代器指针指向集合的首地址,然后逐步移动迭代器指针,直到集合的尾地址:

 
  1. for(set<int>::iterator it = st.begin();it!=st.end();it++)
  2. cout<<*it;

查找元素

在集合中查找指定元素通过find()方法实现,若找到了则返回该元素在集合中的地址,否则返回集合的尾地址:

 
  1. it = st.find(2); //查找指定元素2,it结果为st.end(),因为2已经被删除了

集合清空

集合的清空通过调用clear()方法实现,清空后集合的大小st.size()变为0

 
  1. st.clear()
  2. cout<<st.size(); // 结果为0

编程要求

本关的编程任务是补全右侧代码片段mainBeginEnd中间的代码,具体要求如下:

  • 创建一个空的集合st,数据类型为int

  • 读取数据:第一行整数N,后面N行插入或删除操作,按指定要求输出相应信息;

  • 遍历集合:首先在一行输出集合的大小,然后在下一行输出集合所有元素,中间空格隔开,末尾换行;

  • 读取数据:整数M以及M次查找操作,并按指定要求输出相应信息;

  • 清空集合

测试说明

平台将自动编译补全后的代码,并生成若干组测试数据,接着根据程序的输出判断程序是否正确。

以下是平台的测试样例:

测试输入: 7 insert 2 insert 7 insert 1 erase 3 erase 1 insert 5 erase 7 2 find 7 find 5 预期输出: 3 not in set print set: 2 2 5 find 7 not in set find 5 in set 0

输入格式: 第一行整数N 接下来N行插入或删除操作 整数M 接下来M行查找操作 输出格式: 插入删除阶段:若待删除的元素x不在集合中,则输出:x not in set 遍历集合阶段输出两行,第一行print set: set.size(),第二行集合所有元素x1 x2 x3 ... 查找阶段:若找到元素x,则输出find x in set,否则输出find x not in set 非学员输出0

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值