2013-11-13 5 views
0

У меня есть следующий класс.C++ контейнер - комплект и объект

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) и students.insert(s2), набор будет иметь только один объект, т. Е. s1.

+1

Возможный дубликат [std :: set с определенным пользователем типом, как обеспечить отсутствие дубликатов) (http://stackoverflow.com/questions/1114856/stdset-with-user-defined-type-how-to-ensure -no-дубликатов) –

ответ

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; 
} 

решение при условии, термит не работает, потому что функция сравнения не имеет доступа к закрытым членам class Student. Чтобы решить эту проблему, вы можете объявить operator< в качестве друга. Функция друга (или класс) может обращаться к private и protected членам класса, в которых он объявлен другом.

1

Я никогда не делал этого в C++, но быстро просмотрел http://www.cplusplus.com/reference/set/set/set/ объясняет это красиво. В основном, когда вы экземпляр набора вы должны дать ему объект сравнения, которое «возвращает истину, если первый аргумент идет перед вторым аргументом»

для Интсов это может быть

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 является закрытым. Я рекомендую вам прочитать страницу, связанную с выше, чтобы лучше понять, что происходит.

0

То, как я это делаю, - это определить меньше оператора - если ни один из двух элементов не является чем-то другим, тогда они фактически равны/эквивалентны друг другу - «оригинальная» нить, связанная Даниэлем, показывает это красиво.

Смежные вопросы