C ++容器 - 设置和对象

时间:2013-11-13 21:01:46

标签: c++ containers

我有下课。

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

3 个答案:

答案 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<声明为朋友。友元函数(或类)可以访问声明为朋友的类的privateprotected成员。

答案 2 :(得分:0)

我这样做的方法就是定义less then运算符 - 如果两个元素都不比另一个小,那么它们实际上彼此相等/相等 - 由Daniel链接的“原始”线程很好地显示了这个。 / p>