比较两组 std::weak_ptr

Comparing two sets of std::weak_ptr

提问人:Hans 提问时间:12/20/2012 最后编辑:Hans 更新时间:12/20/2012 访问量:1073

问:

我正在尝试使用 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> >()’
C++ C++11 比较 std stdset

评论


答:

4赞 Dave S 12/20/2012 #1

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

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()));

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

评论

0赞 Hans 12/20/2012
我编辑了我的问题,并评论了您最初的建议。我注意到你更新了答案,我一定会试一试。我将保留原始编辑用于教育目的。
0赞 Hans 12/20/2012
另外,我认为既然我指定了 std::owner_less 作为比较运算符,那么weak_ptr是否实现“==”应该无关紧要?
1赞 Dave S 12/20/2012
@Hans:是的,我在输入它后意识到它会落入“操作员<”,这也有同样的问题。所以把它改成了手动版本,可以使用指定的比较运算符。另外,我的第一次编辑的拼写有点偏离:)
2赞 Dave S 12/20/2012
@Hans:问题在于容器要求指定“==”运算符使用“std::equal”,而“<”使用“std::lexicographical_compare”,但两者都默认使用底层运算符。我认为应该使用集合指定的排序,但这不是它的作用std::set