算法与竞赛(第五章)—第3关:STL模板之关联容器:集合set的操作详解


任务描述

本关任务:仔细阅读下文集合的相关操作,并使用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

//
//  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;
    cin >> n;
    for (int i = 0; i < n; ++i) {
        string operation;
        int value;
        cin >> operation >> value;
        if (operation == "insert") {
            if(st.find(value) == st.end()){
                st.insert(value);
            }
            else
            cout << value << " in set" << endl;
        } 
        else if (operation == "erase") {
            if (st.find(value) != st.end()) {
                st.erase(value);
            } else {
                cout << value << " not in set" << endl;
            }
        }
        
    }

    // 3.遍历集合st,并按指定要求输出
    cout << "print set: " << st.size() << endl;
    for (auto it = st.begin(); it != st.end(); ++it) {
        if (it != st.begin()) cout << " ";
        cout << *it;
    }
    cout << endl;

    // 4.读取数据:整数m以及m次查找操作,并按指定要求输出
    int M;
    cin >> M;
    for(int i = 0; i < M; i++) {
        string operation;
        int x;
        cin >> operation >> x;
        if(operation == "find") {
            if(st.find(x) != st.end()) {
                cout << "find " << x << " in set" << endl;
            } else {
                cout << "find " << x << " not in set" << endl;
            }
        }
    }

    // 5.清空集合st
    st.clear();  
 
    /********* End *********/
    printf("%d\n", int(st.size()));
    
    return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值