比较两组std::weak_ptr

4

我正在尝试使用GCC 4.7.2比较两组C++11 weak_ptr。以下代码展示了最小可能的重现错误的样例:

std::set<std::weak_ptr<int>, std::owner_less<std::weak_ptr<int> > > set1;
std::set<std::weak_ptr<int>, std::owner_less<std::weak_ptr<int> > > set2;

bool result = (set1 == set2);

尝试编译上述代码会导致一长串错误,以下是第一个实际的错误提示:
/usr/include/c++/4.7/bits/stl_algobase.h:791:6: error: no match for ‘operator==’ in ‘__first1.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >() == __first2.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >()’

由于 weak_ptr 的暂时性质,比较整个集合是否相等是不可能的吗?

更新:

有一种建议是使用:

bool result = !((set1 < set2) || (set2 < set1))

这将导致:
/usr/include/c++/4.7/bits/stl_algobase.h:882:6: error: no match for ‘operator<’ in ‘__first1.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >() < __first2.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >()’
1个回答

4

由于weak_ptr不支持'==',但在这种情况下,您可以尝试使用set的比较运算符:

bool result = !(std::lexicographical_compare(set1.begin(), set1.end(),
                                         set2.begin(), set2.end(),
                                         set1.value_comp()) ||
                std::lexicographical_compare(set2.begin(), set2.end(),
                                         set1.begin(), set1.end(),
                                         set1.value_comp()));

这将测试等价性,而不是相等性。但它缺乏一定的...清晰度。


我在我的问题中编辑了一条评论,回应了你最初的建议。我注意到你更新了答案,我一定会尝试一下。为了教育目的,我将保留原始编辑。 - Hans
另外,我认为既然我指定了std::owner_less作为比较运算符,那么weak_ptr是否实现'=='就无关紧要了,对吗? - Hans
1
@Hans:是的,我在输入后意识到它会落入“operator <”中,这也有同样的问题。所以我改成了手动版本,可以使用指定的比较运算符。另外,我的第一个编辑拼写有点错误 :) - Dave S
2
@Hans:问题在于容器要求使用“std::equal”来比较'=='运算符,而使用“std::lexicographical_compare”来比较'<'运算符,但这两个默认都使用底层运算符。我认为std::set应该使用集合指定的排序方式,但实际上并不是这样的。 - Dave S

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接