std::set 错误:与 »运算符<« 不匹配

std::set error: no match for »operator<«

本文关键字:lt 不匹配 set 错误 std 运算符      更新时间:2023-10-16

我有一个类(extract):

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

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

是真的,c++不能够"唯一"的对象(如在这个例子中)到列表和集合,可以处理简单的数据类型,如int, float等?或者我哪里出错了,请帮助我,我不确定错误到底在哪里。

感谢您的支持

问题是,c++ std::set是有序的,因此需要通过计算operator<来对元素进行排序。

基本上你的问题有三个解决方案:

  1. 为你的类实现operator<(在这里看到更多)

     bool operator<(const Package& other) const
     {
         //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));
    

必须为您的类定义operator<。否则,set不能比较它应该存储的对象,因此不能检查它们的唯一性。

当你使用std::set时,内部实现可能会使用operator <来安排对象到bucket, 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 */
        }
}