我有下课。
class Student {
//Parameterized constructor.
private:
int rollNo;
char* name;
float marks;
}
我有set<Student> students
。当我在集合中插入学生对象时,如何sepcify两个对象是相同的。例如。我正在考虑两个对象,如果rollNo
相同,那么Student s1(10,"ABC",35)
和Student s2(10,"XYZ",67)
都是相同的。因此,当我说students.insert(s1)
和students.insert(s2)
时,set将只有一个对象,即s1
。
答案 0 :(得分:1)
我从来没有用c ++做过这个,但快速浏览一下http://www.cplusplus.com/reference/set/set/set/ 很好地解释了。 基本上当你实例化集合时,你需要给它一个比较对象,如果第一个参数在第二个参数之前,则返回true“
对于整数,它可能是
struct classcomp {
bool operator() (const int& lhs, const int& rhs) const
{return lhs<rhs;}
};
在你的情况下更像是
struct StudentCompare{
bool operator() (const Student& lsh, const Student& rhs) const
{
return lhs.rollNo < rhs.rollNo; //or however they need to be compared
}
};
然后你可以像
一样实例化它std::set<int,StudentCompare> mySet;
这不会像你的代码一样工作,因为rollNo是私有的。我建议您阅读我上面链接的页面,以便更好地了解正在进行的操作。
答案 1 :(得分:1)
您需要为operator>
class Student
示例代码
class Student {
/* everything you already have */
public:
friend bool operator<(const Student& lhs, const Student& rhs);
};
bool operator<(const Student& lhs, const Student& rhs) {
return lhs.rollNo < rhs.rollNo;
}
解决方案提供的thermite不起作用,因为比较功能无法访问class Student
的私人成员。要解决此问题,您可以将operator<
声明为朋友。友元函数(或类)可以访问声明为朋友的类的private
和protected
成员。
答案 2 :(得分:0)
我这样做的方法就是定义less then运算符 - 如果两个元素都不比另一个小,那么它们实际上彼此相等/相等 - 由Daniel链接的“原始”线程很好地显示了这个。 / p>