【问题标题】:Custom comparison operator and custom class for std::set in C++C++ 中 std::set 的自定义比较运算符和自定义类
【发布时间】:2014-06-26 15:10:11
【问题描述】:

我想创建一个包含我的类的对象的集合,我必须确定一个自定义比较。不幸的是,我尝试的所有方法都不起作用。

class My_Class {
    public:
        char letter;
        set<My_Class, compare> Children;
};

Ant 然后是比较结构体:

struct compare {
    bool operator() (const My_Class& a, const My_Class& b) const{
        return a.letter < b.letter;
    }
};

请问我怎样才能完成这项工作?

目前,问题显示标识符 ab 未声明。

【问题讨论】:

  • 你能解释一下“没有工作”吗?
  • 看起来您可能在 compare 的文件中缺少 MyClass.h(或其他)。此外,您可能应该让operator() 获取const My_Class&amp; 而不是复制。
  • @dlf 不可能,因为compareMy_Class 在同一个文件中。我尝试使用My_Class&amp;,但遇到了同样的问题。
  • 那么compare 是否高于My_Class
  • I would like to create a set containing the objects of my class 为什么让set 成为 My_Class 的成员?

标签: c++ char set compare stdset


【解决方案1】:

您正在尝试在My_Class 中使用compare 结构,该结构在其方法中使用My_Class。这不是一个小例子,但前向声明会有所帮助。所以这应该有效:

class My_Class;

struct compare {
    bool operator() (const My_Class &a, const My_Class &b) const;
};

class My_Class {
public:
    char letter;
    set<My_Class, compare> Children;
};

bool compare::operator() (const My_Class &a, const My_Class &b) const
{
    return a.letter < b.letter;
}

另一种选择是将比较器传递给 std::set 构造函数,而不是将其指定为模板参数:

class My_Class {
public:
    My_Class();
    char letter;
    set<My_Class> Children;
};

struct compare {
    bool operator() (const My_Class& a, const My_Class& b) const{
        return a.letter < b.letter;
    }
};

My_Class::My_Class() : Children( compare() )
{
}

【讨论】:

  • 查看我的最后评论。我认为由于在T 的定义中使用了set&lt;T&gt;,代码甚至不必编译成功。
【解决方案2】:

你的代码的问题是它不能保证编译。问题不在于compare 结构,所以请把它从图片中删除。是这样的:

class My_Class {
public:
    char letter;
    set<My_Class, compare> Children;  // it is the set<My_Class> that is the problem
};

在编译器知道 My_Class 的定义之前,您正在定义 My_Classstd::set。换句话说,您在 std::set 容器中使用了不完整的类型。无法保证代码会编译,即使编译了,现在的行为也是未定义的。

如果您想要使用不完整类型的容器,可以在此处使用 Boost 容器类型:
http://www.boost.org/doc/libs/1_55_0/doc/html/container.html

这是 Boost 文档中关于不完整类型的描述: http://www.boost.org/doc/libs/1_55_0/doc/html/container/main_features.html#container.main_features.containers_of_incomplete_types

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多