C++ c++;集合-使用链表的数据结构
Tm试图获得链表中两个集合的差异 示例:C++ c++;集合-使用链表的数据结构,c++,set,set-difference,C++,Set,Set Difference,Tm试图获得链表中两个集合的差异 示例: 输入: A组:1-2-3-5 B组:2-4-5 输出: 工会:5-4-2-5-3-2-1 交叉口:5-2 差异:3-4-1(这里的问题)矿井产出差异:5-3-2-1 此代码位于“LinkedList.h”下 您对差异的实现太复杂了:因为列表已经排序,所以您需要做的就是查找不匹配的元素。这需要一个循环,在每次迭代中移动一个循环 两个迭代器,如果元素在两个集合中,即它不是差异的一部分 第一个列表的迭代器,在这种情况下,元素位于第一个集合中,但不在第二个集
输入:
A组:1-2-3-5
B组:2-4-5
输出:
工会:5-4-2-5-3-2-1
交叉口:5-2
差异:3-4-1(这里的问题)矿井产出差异:5-3-2-1
此代码位于“LinkedList.h”下
您对
差异的实现太复杂了:因为列表已经排序,所以您需要做的就是查找不匹配的元素。这需要一个循环,在每次迭代中移动一个循环
- 两个迭代器,如果元素在两个集合中,即它不是差异的一部分
- 第一个列表的迭代器,在这种情况下,元素位于第一个集合中,但不在第二个集合中
- 第二个列表的迭代器,在这种情况下,有一个元素在第二个集合中,但不在第一个集合中
交叉点的实现同样太复杂,而且只需要一个循环:在没有为Difference()
存储元素的情况下,它只存储公共值。最后,Union()
也太复杂了:它会在每次迭代中存储一个元素,要么是公共元素,要么是跳过的元素,具体取决于采用哪个分支。这也将产生正确的结果
显然,您真正想要使用的是
std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_difference));
假设您为列表和迭代器提供了一个标准接口。7年后,这里是您的答案
void Difference(Set& ListA, Set& ListB)
{
for (member* i5 = ListA.head; i5 != NULL; i5 = i5->next)
{
for (member* i6 = ListB.head; i6 != NULL; i6 = i6->next)
{
if (i6->data != i5->data && ListA.find(i6) != 1 && ListB.find(i5) != 1) {
List::insert(i5->data);
List::insert(i6->data);
}
else {
continue;
}
}
}
}
在标准定义中,“联合”输出也是错误的——不应该有重复的元素。
std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_difference));
void Difference(Set& ListA, Set& ListB)
{
for (member* i5 = ListA.head; i5 != NULL; i5 = i5->next)
{
for (member* i6 = ListB.head; i6 != NULL; i6 = i6->next)
{
if (i6->data != i5->data && ListA.find(i6) != 1 && ListB.find(i5) != 1) {
List::insert(i5->data);
List::insert(i6->data);
}
else {
continue;
}
}
}
}