提问人:Hans 提问时间:12/20/2012 最后编辑:Hans 更新时间:12/20/2012 访问量:1073
比较两组 std::weak_ptr
Comparing two sets of std::weak_ptr
问:
我正在尝试使用 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> >()’
答:
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
评论