做一个精致的利己主义者
//
// 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()
方法实现:
set<int> st; // 创建一个整型集合st
st.insert(1); // 向st插入一个元素1
st.insert(2); // 向st插入一个元素2
删除元素
集合元素的删除通过调用erase()
方法实现,传入的参数可以是待删除的元素,也可以是待删除元素的地址:
set<int>::iterator it = st.begin(); // 定义一个迭代器,初始为st的首地址
cout<<*it; // 输出为元素1
st.erase(it); // 删除it指向的元素1
st.erase(2); // 删除元素2
遍历集合
集合的遍历通过迭代器的方式进行,首先让迭代器指针指向集合的首地址,然后逐步移动迭代器指针,直到集合的尾地址:
for(set<int>::iterator it = st.begin();it!=st.end();it++)
cout<<*it;
查找元素
在集合中查找指定元素通过find()
方法实现,若找到了则返回该元素在集合中的地址,否则返回集合的尾地址:
it = st.find(2); //查找指定元素2,it结果为st.end(),因为2已经被删除了
集合清空
集合的清空通过调用clear()
方法实现,清空后集合的大小st.size()
变为0
:
st.clear()
cout<<st.size(); // 结果为0
编程要求
本关的编程任务是补全右侧代码片段main
中Begin
至End
中间的代码,具体要求如下:
-
创建一个空的集合
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