0

我有以下课程。

class Student {   
    //Parameterized constructor.
    private:
       int rollNo;
       char* name;
       float marks;
 }

我有一个set<Student> students. 当我在集合中插入一个学生对象时,我怎样才能确定两个对象是相同的。rollNo例如,如果它们相同Student s1(10,"ABC",35)并且Student s2(10,"XYZ",67)两者相同,我正在考虑两个相同的对象。所以当我说students.insert(s1)and时students.insert(s2), set 将只有一个对象,即s1

4

3 回答 3

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 是私有的。我建议您阅读我上面链接到的页面,以更好地了解正在发生的事情。

于 2013-11-13T21:18:08.093 回答
0

您需要声明和定义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;
}

解决方案提供的铝热剂不起作用,因为比较功能无法访问class Student. 为了解决这个问题,你可以声明operator<为朋友。友元函数(或类)可以访问声明为友元的类的private和成员。protected

于 2013-11-13T21:53:13.423 回答
0

我这样做的方法只是定义小于运算符 - 如果两个元素中的任何一个都不小于另一个,那么它们实际上是相等/等价的 - Daniel 链接的“原始”线程很好地说明了这一点。

于 2013-11-13T21:39:35.080 回答