[Aizu] ITP2_9_A~D: Set Operation
前言
ITP系列之集合运算
题目链接
集合并集: ITP2_9_A: Set Union
集合交集: ITP2_9_B: Set Intersection
集合差: ITP2_9_C: Set Difference
集合差异: ITP2_9_D: Set Symmetric Difference
求解
set介绍
std::set is an associative container that contains a sorted set of unique objects of type Key. Sorting is done using the key comparison function Compare. Search, removal, and insertion operations have logarithmic complexity. Sets are usually implemented as red-black trees.
std :: set是一个关联容器,包含一组有序的Key类型的唯一对象。 使用密钥比较功能比较进行排序。 搜索,删除和插入操作具有对数复杂性。 集合通常实现为红黑树。
Everywhere the standard library uses the Compare requirements, uniqueness is determined by using the equivalence relation. In imprecise terms, two objects a and b are considered equivalent if neither compares less than the other: !comp(a, b) && !comp(b, a).
标准库的每个地方都使用比较要求,唯一性通过使用等价关系来确定。 不精确的说,如果两个对象的比较小于另一个,则认为两个对象a和b是等价的:!comp(a,b)&&!comp(b,a)。
set常用方法
方法名 | 描述 | 示例 |
---|---|---|
size() | 返回set中的元素数 | cout << my_set.size(); |
clear() | 清空set | my_set.clear(); |
begin() | 返回指向set开头的迭代器 | set |
end() | 返回指向set末尾的迭代器 | if (it != my_set.end()) {...} |
insert(key) | 向set中插入元素key | my_set.insert(5); |
erase(key) | 删除与key匹配的元素 | my_set.erase(5); |
find(key) | 搜索与key一致的元素, 并返回指向该元素的迭代器, 如果不存在该元素, 则返回末尾end() | if (my_set.find(5) != my_set.end()) {...} |
count(key) | 返回与key匹配的元素数 | if (my_set.count(5)) {...} |
lower_bound(key) | 搜索不小于key的第一个元素, 并返回指向该元素的迭代器 | it = my_set.lower_bound(5); |
upper_bound(key) | 搜索大于key的第一个元素, 并返回指向该元素的迭代器 | it = my_set.upper_bound(5); |
我的代码
第一题
// file name: 求两个集合的并集
// Written by: by_sknight
// Date: 2019/6/12
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
set<int> A, B, result;
set<int>::iterator it;
int n, m, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
A.insert(x);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> x;
B.insert(x);
}
for (it = A.begin(); it != A.end(); it++) {
result.insert(*it);
}
for (it = B.begin(); it != B.end(); it++) {
result.insert(*it);
}
for (it = result.begin(); it != result.end(); it++) {
cout << *it << endl;
}
return 0;
}
第二题
// file name: 求两个集合的交集
// Written by: by_sknight
// Date: 2019/6/12
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
set<int> A, B, result;
set<int>::iterator it;
int n, m, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
A.insert(x);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> x;
B.insert(x);
}
for (it = A.begin(); it != A.end(); it++) {
if (B.find(*it) != B.end()) {
result.insert(*it);
}
}
for (it = result.begin(); it != result.end(); it++) {
cout << *it << endl;
}
return 0;
}
第三题
// file name: 求两个集合的差(A - B), 并不是所有AB不同的元素
// Written by: by_sknight
// Date: 2019/6/12
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
set<int> A, B, result;
set<int>::iterator it;
int n, m, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
A.insert(x);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> x;
B.insert(x);
}
for (it = A.begin(); it != A.end(); it++) {
if (B.find(*it) == B.end()) {
result.insert(*it);
}
}
for (it = result.begin(); it != result.end(); it++) {
cout << *it << endl;
}
return 0;
}
第四题
// file name: 求两个集合的差异(A中有B中无, B中有A中无)
// Written by: by_sknight
// Date: 2019/6/12
#include <bits/stdc++.h>
using namespace std;
int main(void) {
ios::sync_with_stdio(false);
cin.tie(0);
set<int> A, B, result;
set<int>::iterator it;
int n, m, x;
cin >> n;
for (int i = 0; i < n; i++) {
cin >> x;
A.insert(x);
}
cin >> m;
for (int i = 0; i < m; i++) {
cin >> x;
B.insert(x);
}
for (it = A.begin(); it != A.end(); it++) {
if (B.find(*it) == B.end()) {
result.insert(*it);
}
}
for (it = B.begin(); it != B.end(); it++) {
if (A.find(*it) == A.end()) {
result.insert(*it);
}
}
for (it = result.begin(); it != result.end(); it++) {
cout << *it << endl;
}
return 0;
}
别人的代码
第一题
3160702 Solution for ITP2_9_A by c7c7
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
set<int>a,b;
cin>>n;
while(n--){
int x;
cin>>x;
a.insert(x);
}
cin>>n;
while(n--){
int x;
cin>>x;
b.insert(x);
}
vector<int>c;
set_union(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
for(int i=0;i<c.size();i++)cout<<c[i]<<endl;
}
第二题
3160698 Solution for ITP2_9_B by c7c7
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
set<int>a,b;
cin>>n;
while(n--){
int x;
cin>>x;
a.insert(x);
}
cin>>n;
while(n--){
int x;
cin>>x;
b.insert(x);
}
vector<int>c;
set_intersection(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
for(int i=0;i<c.size();i++)cout<<c[i]<<endl;
}
第三题
3160705 Solution for ITP2_9_C by c7c7
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
set<int>a,b;
cin>>n;
while(n--){
int x;
cin>>x;
a.insert(x);
}
cin>>n;
while(n--){
int x;
cin>>x;
b.insert(x);
}
vector<int>c;
set_difference(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
for(int i=0;i<c.size();i++)cout<<c[i]<<endl;
}
第四题
3160709 Solution for ITP2_9_D by c7c7
#include <bits/stdc++.h>
using namespace std;
int main(){
int n;
set<int>a,b;
cin>>n;
while(n--){
int x;
cin>>x;
a.insert(x);
}
cin>>n;
while(n--){
int x;
cin>>x;
b.insert(x);
}
vector<int>c;
set_symmetric_difference(a.begin(),a.end(),b.begin(),b.end(),back_inserter(c));
for(int i=0;i<c.size();i++)cout<<c[i]<<endl;
}
总结
看了别人的代码, 发现有可以直接用的方法, 但是当时并不知道...
原文地址:https://www.cnblogs.com/by-sknight/p/11007385.html
- QQ定位女友是否回家系列二之定位系统的打造
- htcap:一款实用的递归型Web漏洞扫描工具
- 使用Go和Let's Encrypt证书部署HTTPS
- md5算法
- 《JavaScript高级程序设计》学习笔记(3)——变量、作用域和内存问题
- King Phisher:一款专业的钓鱼活动工具包
- 是不是Bash编程老司机,看完这10条细节就知道了
- 以针对Yahoo! 的安全测试为例讲解如何高效的进行子域名收集与筛选
- 线程池
- hbase 部署
- Hadoop源码系列(一)FairScheduler申请和分配container的过程
- MOTS攻击之TCP攻击
- iOS学习——获取当前最顶层的ViewController
- 中国深圳一家厂商的智能摄像头曝出漏洞:至少 17.5 万设备可被远程攻击
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「Mysql索引原理(四)」单列索引
- 「Mysql索引原理(五)」多列索引
- 「Mysql索引原理(六)」聚簇索引
- 「Mysql索引原理(七)」覆盖索引
- 「Mysql索引原理(八)」使用索引扫描做排序
- 「Mysql索引原理(九)」前缀压缩索引
- 「Mysql索引原理(十)」冗余和重复索引
- 「Mysql索引原理(十一)」索引和锁
- 「Mysql索引原理(十二)」索引案例1-支持多种过滤条件
- 「Mysql索引原理(十三)」索引案例2-避免多个范围条件
- 「Mysql索引原理(十四)」索引案例3-优化排序
- 字符仿真
- 「Mysql索引原理(十五)」维护索引和表-修复损坏的表
- 「Mysql索引原理(十六)」维护索引和表-更新索引统计信息
- 「Mysql索引原理(十七)」维护索引和表-减少索引和数据的碎片