实验代码:
#include<set>
#include<iostream>
#include<iterator>
#include<algorithm>
using namespace std;
void in(set<string> &A)
{
int n;
string value;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>value;
A.insert(value);
}
}
void out(set<string> &A)
{
set<string>::iterator it=A.begin();
while(it!=A.end())
{
cout<<*it<<" ";
it ++;
}
}
void jiao(set<string> &A,set<string> &B,set<string> &C)
{
set<string>::iterator it;
it=A.begin();
while(it!=A.end())
{
if(B.find(*it)!=B.end())
C.insert(*it);
it++;
}
}
void bing(set<string> &A,set<string> &B,set<string> &C)
{
set<string>::iterator it;
it=A.begin();
while(it!=A.end())
{
C.insert(*it);
it++;
}
it=B.begin();
while(it!=B.end())
{
C.insert(*it);
it++;
}
}
void cha(set<string> &A,set<string> &B,set<string> &C)
{
set<string>::iterator it;
it=A.begin();
while(it!=A.end())
{
if(B.find(*it)==B.end())
C.insert(*it);
it++;
}
}
int main(){
set<string> b,j,c1,c2;
set<string> A,B;
cout<<"请分别输入集合A中元素个数和元素: ";
in(A);
cout<<"请分别输入集合B中元素个数和元素: ";
in(B);
jiao(A,B,j);
bing(A,B,b);
cha(A,B,c1);
cha(B,A,c2);
cout<<"A交B:";
out(j);
cout<<endl;
cout<<"A并B:";
out(b);
cout<<endl;
cout<<"A-B:";
out(c1);
cout<<endl;
cout<<"B-A:";
out(c2);
cout<<endl;
return 0;
}
代码分析:
- 整体思路:因为set中没有重复元素,所以可利用set集合,这样能够免去去重步骤。先用set集合中的insert()方法对元素进行添加;然后将并交叉作为三个void函数,参数为三个set集合(A、B、C),A、B是已经添加完元素的集合,用来运算,C是空集合,用来装入A、B运算完之后的元素;最后输出集合C中的元素,即运算结果。为减少代码量,元素的输入和输出可以自定义函数(in、out)。
- 集合“并”运算bing
void bing(set<string> &A,set<string> &B,set<string> &C)
{//A、B是已经添加完元素的集合,C是空集合
set<string>::iterator it;//迭代器it
it=A.begin();//it指向A的第一个元素
while(it!=A.end())
{
C.insert(*it);
it++;
}//将A中元素添加到C中
it=B.begin();//it指向B的第一个元素
while(it!=B.end())
{
C.insert(*it);
it++;
}//将B中元素添加到C中
}
- 集合“交”运算jiao
void jiao(set<string> &A,set<string> &B,set<string> &C)
{//A、B是已经添加完元素的集合,C是空集合
set<string>::iterator it;//迭代器it
it=A.begin();//it指向A的第一个元素
while(it!=A.end())
{
if(B.find(*it)!=B.end())
C.insert(*it);//若B中存在A中的元素*it,则C添加元素*it
it++;
}
}
- 集合“叉”运算cha
void cha(set<string> &A,set<string> &B,set<string> &C)
{//A、B是已经添加完元素的集合,C是空集合
set<string>::iterator it;//迭代器it
it=A.begin();//it指向A的第一个元素
while(it!=A.end())
{
if(B.find(*it)==B.end())
C.insert(*it);//若B中不存在A中的元素*it,则C添加元素*it
it++;
}
}
- 输入函数in
void in(set<string> &A)
{
int n;//n为集合元素个数
string value;//value为元素值
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>value;
A.insert(value);//将元素value添加到A中
}
}
输出函数out
void out(set<string> &A)
{
set<string>::iterator it=A.begin();//迭代器it指向集合的第一个元素
while(it!=A.end())
{
cout<<*it<<" ";
it ++;
}
}
实验总结:
①本次实验用到了set集合中的迭代器、insert()方法等,对set集合的运用更加深入。
②set集合中没有重复的元素,利用这一点,可以省去集合的去重这一步骤,减少代码量。
③对于元素的输入输出,可以写两个自定义函数in和out,减少代码量。