使用std :: set <myownobjecttype>是问题的根源吗?</myownobjecttype>

时间:2014-12-08 22:33:04

标签: 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的数据结构,除了它能够容纳任何类型的元素?我希望保存相同类型的对象而不重复的东西,最好是快速访问。

1 个答案:

答案 0 :(得分:2)

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

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

如果比较的概念不适用于XMLNode,那么您可能对编制人工比较标准或使用std::unordered_set(提供分摊的O(1)访问)并提供实现的兴趣感兴趣。 std::hash<XMLNode>