c++ - 比较两组 std::weak_ptr

标签 c++ c++11 compare std stdset

我正在尝试使用 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 的 transient 特性,是否不可能比较它们的整个集合?

更新:

一个建议是使用:

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

最佳答案

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

这将测试等价性,而不是相等性。而且它缺乏某种……清晰度。

关于c++ - 比较两组 std::weak_ptr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13959743/

相关文章:

java - 如何对预排序 TreeSet 中对象的某些属性进行排序?

c++ - 执行一个故意在另一个程序中崩溃的程序,然后返回到原始进程

c++ - glColor不会改变opengl中其他三角形的颜色

c++ - 在不使用宏的情况下评估采用函数参数 DRY 的元函数?

c++ - std::ios::openmode 的组合以避免修改现有文件?

java - 何时使用 extends 或 Implements Comparable (Java) ? + 为什么我无法创建对象

c++ - 分析我的代码(开源)和第 3 方代码(闭源)的内存使用情况的最佳策略

c++ - DLL加载库-错误代码126

C++ 容器集 + 数组功能

windows - Powershell:始终生成空文件(比较对象的输出)