我正在处理无符号typedef pair<unsigned, unsigned> OP;
类型的有序对和有序对typedef set<OP> SOP
;的集合。
我的程序的最终目标是检查set(relation)是否为等价关系。
我的问题:我已经设法检查集合是否自反,但目前我正在尝试检查集合(关系)中的有序对是否对称。我目前已经构造了两个for循环,以将有序对彼此进行比较,但是在比较中却陷入了死胡同。
我的代码:
for (auto it3 = sop.begin(); it3 != sop.end(); it3++) { // loop through each pair in set
for (auto it4 = sop.begin(); it4 != sop.end(); it4++) { // compare with other pairs
// make sure first and second items in pair are different
while (it3->first != it3->second) {
//If the case is that there is not an instance of
//symmetric relation return false
if (!((it3->first == it4->second) && (it3->second == it4->first))) {
return false;
}
}
}
}
答案 0 :(得分:1)
您的循环逻辑是完全有缺陷的。
内部while不会更改it3或it4。因此,它将返回false或将永远循环。另外,内部的for循环不利用集合有序的事实。
您正在寻找的测试要简单得多
在sop
上循环就足够了,并检查对称项是否也位于集合中。如果不是,那不是对称关系。如果所有人都成功找到了反面,那很好:
bool is_symetric (SOP sop) {
for (auto it3 = sop.begin(); it3 != sop.end(); it3++) { // loop through each pair in set
if (it3->first != it3->second) {
if (sop.find({it3->second,it3->first })==sop.end()) {
return false;
}
}
}
return true;
}
如果允许使用算法库,甚至还有一个更酷的解决方案:
bool is_symetric (SOP sop) {
return all_of(sop.cbegin(), sop.cend(),
[&sop](auto &x){ return x.first==x.second || sop.find({x.second,x.first })!=sop.end();}) ;
}
更酷的是,如果您将其设为模板,则不仅可以与unsigned一起使用,而且可以与其他任何类型一起使用:
template <class T>
bool is_symetric (set<pair<T,T>> sop) {
return all_of(sop.cbegin(), sop.cend(),
[&sop](auto &x){ return x.first==x.second || sop.find({x.second,x.first })!=sop.end();}) ;
}