问题:假设有集合a和b,a和b中分别有不同或者相同的数据,实现a和b的并集操作
首先要定义一个结构体,在这里是学生结构体包含学号,姓名,性别,其中假设学号具有唯一性。
有两种方法可以实现两个集合的并集,一种是将b集合的全部放到新的c集合中,然后从a集合的第一个元素开始遍历b集合,如果这个元素和b集合里所有元素都不一样,那么插入到c集合中。
第二种是将a和b两个集合全都放到c集合中,再对c集合进行遍历,找到重复的元素进行删除。
首先是两种方法都需要的准备工作,定义结构体和集合a,b,c,还有判断元组是否相同的方法。
struct student{
QString name;
int nubmer;
QString sex;
};
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
QVector<student> s1;
QVector<student> s2;
bool same(student s1,student s2);
QVector<student> bing(QVector<student> s1,QVector<student> s2);
QVector<student> bing2(QVector<student> s1,QVector<student> s2);
};
这部分是在头文件里准备,集合a,b命名为s1,s2.下面是根据学号判断元组是否相同。
bool Widget::same(student s1, student s2)
{
if(s1.nubmer == s2.nubmer){
return true;
}
return false;
}
方法一的实现:
QVector<student> Widget::bing(QVector<student> s1, QVector<student> s2)
{
QVector<student> s3;
s3 = s2;
for(int i=0;i<s1.length();i++){
for(int j=0;j<s2.length();j++){
if(same(s1[i],s2[j])){
qDebug() << "xiangtong";
break;
}
if(j == s1.length()-1){
s3.push_back(s1[i]);
}
}
}
return s3;
}
方法二的实现:
QVector<student> Widget::bing2(QVector<student> s1, QVector<student> s2)
{
QVector<student> s3;
s3 = s1+s2;
QHash<int,int> stu;
for(int i=0;i<s3.length();i++){
if(!stu.contains(s3[i].nubmer)){
stu.insert(s3[i].nubmer,1);
}
else{
s3.remove(i);
}
}
return s3;
}
方法的判断相同的方法使用哈希表,如果一个元组已经在哈希表里存在了,说明重复,则删除这个元组。