std :: set error:不匹配»operator<«

时间:2014-05-15 07:59:35

标签: c++ c++11 set

我有一个班级(摘录):

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&lt;«(操作数类型是»const Package«和»const   包«)

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

C ++是否能够将“唯一”对象(如本示例中所示)放入列表和集合中,并且只能处理简单的数据类型,如int,float等?或者我在某处出错了,请帮助我,我不确定错误的确切位置。

感谢您的支持

3 个答案:

答案 0 :(得分:4)

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

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

  1. 为您的班级实施operator<(查看更多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));
    

答案 1 :(得分:2)

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

答案 2 :(得分:1)

当您使用std::set时,内部实现可能会使用operator <将对象排列到存储桶,RBTree等中。(因为std::set已排序)所以它需要operator <。编译器默认不提供比较运算符,因此您需要自己实现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 */
        }
}