我有一个班级(摘录):
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等?或者我在某处出错了,请帮助我,我不确定错误的确切位置。
感谢您的支持
答案 0 :(得分:4)
问题是,c ++ std::set
is orderd,因此需要通过评估operator<
对元素进行排序。
基本上,您的问题有三种解决方案:
为您的班级实施operator<
(查看更多here)
bool operator<(const Package& other) {
//return true if this < other
}
使用类似std::unordered_set
的未排序集,但是您必须实现相等运算符和哈希函数。
实现比较器函数并将其作为第二个模板参数传递给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 */
}
}