c++ - 使用 std::set<myOwnObjectType> 是问题的根源吗?

标签 c++

我制作了几个程序,当我用自己的对象编写 std::set 时,编译器没有标记任何错误,但是当我尝试构建程序时,我出现一些错误,似乎指向 std::set 的某些实现文件。例如,在我的程序中,编译器现在指向该行

struct _LIBCPP_TYPE_VIS_ONLY less : binary_function<_Tp, _Tp, bool>
{
    _LIBCPP_CONSTEXPR_AFTER_CXX11 _LIBCPP_INLINE_VISIBILITY 
    bool operator()(const _Tp& __x, const _Tp& __y) const
        {return __x < __y;} // <---- That's the problem line
};

有错误

Invalid operands to binary expression ('const XMLNode' and 'const XMLNode')

并且可以追溯到该行

std::set<XMLNode> children;

在我的代码中。我的假设是否正确,即程序因不知道如何比较 XMLNode 元素而感到困惑?如果是这样,我可以使用什么类似于 std::set 的数据结构,只不过它可以容纳任何类型的元素?我想要一些能够保存相同类型的对象而没有任何重复并且最好能够快速访问的东西。

最佳答案

树(集合的底层结构)依赖于能够比较对象来决定将它们插入哪个分支,并最终提供 O(log n) 访问。

因此,如果你想使用std::set ,您的类型需要提供一种比较对象的方法 - 通过 operator <std::less<XMLNode> 的实现,或者在通过 Compare 声明集合时传递比较器,它的第一个模板参数。

如果比较的概念不适用于 XMLNode,那么您可能有兴趣制定一个人为的比较标准,或者使用 std::unordered_set (提供摊销 O(1) 访问)并提供 std::hash<XMLNode> 的实现.

关于c++ - 使用 std::set<myOwnObjectType> 是问题的根源吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27368237/

相关文章:

C++:带有内存映射文件的 DLL

c++ - cmake os x 失败 ar 没有特定的存档成员

c++ - Qt .pro 文件 - 如何在 OSX 版本上添加条件?

c++ - 调用子类 QWidget 的方法

c++ - Matlab转C++代码生成(hdf5格式)

c++ - 我们可以在运行时检查动态数组的大小吗

c++ - 如何将 _variant_t 转换为 IXMLDOMDocumentPtr?

C++ Valgrind 无效删除动态数组

c++ - 模板类的模板成员特化

c++ - 如何逐步组合 3d 网格