【问题标题】:std::set error: no match for »operator<« [duplicate]std::set 错误:不匹配 »operator<« [重复]
【发布时间】:2014-07-03 13:21:18
【问题描述】:

我有一堂课(摘录):

class Package
{
private:
        string s_package_name;
        float f_boottime;
        float f_bytesize;
        list <Package> l_depends;
        list <Package> l_selects;
}

我想生成许多对象并将它们列在一个唯一的“数组”中,因此我采用了set 我添加了这样的对象:

set<Package> l_tempSet;   
Package PackageA(1, 11, "what a package");
Package PackageB(2, 22, "what a 2nd package");

l_tempSet.insert(PackageA);
l_tempSet.insert(PackageB);

编译时收到错误消息:

不匹配 »operator

当单击错误消息时,它会将 set.h 指向调用 unique 的行,我认为这是错误。

C++ 确实不能将对象(如本例中的)“唯一”放入列表和集合中,并且只能处理简单的数据类型,如 int、float 等吗?还是我哪里出错了,请帮帮我,我不确定错误到底在哪里。

感谢您的支持

【问题讨论】:

  • 为您的班级实施运算符
  • 你能解释一下吗? (你有任何搜索标签可以谷歌搜索吗?)
  • 我在答案中为每个解决方案添加了参考。
  • 如果您的问题得到了回答,您应该确保将答案标记为已接受,以备将来参考。
  • 我怀疑您不想像尝试那样添加对象的副本。请记住,C++ 对所有事物都有 value 语义。

标签: c++ c++11 set


【解决方案1】:

问题是,c++ std::set is orderd,因此它需要通过评估 operator&lt; 来对元素进行排序。

您的问题基本上有三种解决方案:

  1. 为您的班级实施operator&lt;(查看更多here

    bool operator<(const Package& other) {
        //return true if this < other
    }
    
  2. 使用像std::unordered_set 这样的未排序集合,但你必须实现相等运算符和哈希函数。

  3. 实现一个比较器函数并将其作为第二个模板参数传递给set

    bool smaller (const Package& left, const Package& right) 
    {
        //return true if left < right;
    }
    std::set<Package,std::function<bool(const Package&, const Package&)>> newSet (std::function<bool(const Package&, const Package&)>(smaller));
    

【讨论】:

  • 如果你使用unordered_set,那么你有两个问题。您必须实现一个哈希函数和一个相等运算符。
  • @BenjaminLindley 是的,我在答案中添加了它。但它仍然解决了操作符
  • 它不必评估operator&lt;。您可以使用自己的比较逻辑(以用户定义的仿函数的形式)实例化一个集合。如果您的班级没有自然的operator&lt;,这是一个很好的策略。
  • @juanchopanza 听起来是一个有自己比较值的好主意。但我想这并不能解决“独特”的问题。
  • @user3085931 确实如此。
【解决方案2】:

您必须为您的班级定义operator&lt;。否则,set 无法比较它应该存储的对象,因此无法检查它们的唯一性。

【讨论】:

  • +1 是解决唯一性实际含义问题的唯一答案。
  • @KerrekSB 需要注意的是您没有定义operator&lt;
  • @juanchopanza:是的......最好从“独特意味着什么”开始,然后从那里开发可能的解决方案。哦,好吧。
【解决方案3】:

当你使用std::set时,内部实现可能会使用operator &lt;将对象排列到桶、RBTree等中(因为std::set是有序的)所以它需要operator &lt;。编译器默认不提供比较运算符,需要自己实现1。

class Package
{
private:
        string s_package_name;
        float f_boottime;
        float f_bytesize;
        list <Package> l_depends;
        list <Package> l_selects;
public:
        bool operator <(const Package &t) {
          /* your logic */
        }
}

【讨论】:

  • 感谢(所有!)您的快速回复。我用谷歌搜索了一下,我找不到任何东西。我想我理解了它背后的逻辑,但我不确定它的实现:bool 运算符的主体中到底是什么,“&t”是什么
  • &amp;t 表示 t 是 reference。关于主体,您可以放置​​任何可以判断 1 个对象是否小于其他对象的逻辑。
  • 不要责怪编译器。它只是在做它被告知的事情。该语言不允许它发明运算符重载。
猜你喜欢
  • 2016-08-28
  • 2012-03-02
  • 2011-03-13
  • 2015-09-09
  • 1970-01-01
  • 2012-08-04
  • 2011-10-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多