сортировка векторного объекта Student по последнему первому идентификатору

0

это строка для сравнения, lastname + firstName и id comp являются общедоступными, мой метод сортировки не работает, я не могу найти, где код не работает, у меня должны быть ученики, перечисленные в заказе

comp=new char[strlen(lName)+strlen(fName)+strlen(id)+1];

это мой ученик-конструктор:

Student::Student(char * first, char * last, char *i,char * stand, int credit, double g, Date * d, Date * matricDate){
        lName=last;
        fName=first;
        id=i;
        standing=stand;
        credits=credit;
        gpa=g;
        dob=d;
        matDate=matricDate;
        comp=new char[strlen(lName)+strlen(fName)+strlen(id)+1];
        sprintf(comp,"%s%s%s",lName,fName,id);
};

это перегрузка оператора I

 bool Student::operator<(const Student &second){
                if(comp<second.comp){
                        return true;
                }else{
                        return false;
                }
        };

У меня есть список учеников:

 vector<Student *> roster_list;

Я добавляю такого ученика:

void Roster::addStudent(Student *student){

        roster_list.push_back(student); 

        };

вот мой вид:

void Roster::mySort(){
        sort(roster_list.begin(),roster_list.end());
};

мой основной:

#include<iostream>
#include"Roster.cpp"
#include "Date.cpp"
#include "Student.cpp"

using namespace std;


int main(){

        Roster *r=new Roster();
        Date *d=new Date(12,05,1987);
        Student *st=new Student("Jason", "Sam", "124542", "sophomore", 34, 4.0, d,d);
        Student *st2=new Student("Ahmad", "Khan", "23452", "freshman", 34, 4.0, d,d);

        Student *st3=new Student("Selam", "Can", "23431", "freshman", 34, 3.0, d,d);
        Student *st4=new Student("Andrew", "Rosenberg", "34523", "Senior", 34, 4.0, d,d);
        Student *st5=new Student("Selam", "Can", "23431", "freshman", 34, 3.0, d,d);


        r->addStudent(st);
        r->addStudent(st2);
        r->addStudent(st3);
        r->addStudent(st4);

        // Student 3 and 5 are same 
        // == operator check
        if(*st3==*st5){
                cout<<"Students are same \n";
        }

        // != overloading operator check
        if(*st3!=*st4){
                cout<<"Students are different\n";
        }

        cout<<"################Before Sorting###############\n";
        r->toString();
        cout<<"################After Sorting###############\n";
        r->mySort();
        r->toString();



        cout<<"\n"<<st->getComp();
        cout<<"\n"<<st3->getComp();

        return 0;
}

ВЫВОД:

Students are same 
Students are different
################Before Sorting###############
Student Info:Jason      Sam     124542  sophomore       4
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Ahmad      Khan    23452   freshman        4
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Selam      Can     23431   freshman        3
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Andrew     Rosenberg       34523   Senior  4
Birth Date: December 5, 1987
Matric Date: December 5, 1987
################After Sorting###############
Student Info:Jason      Sam     124542  sophomore       4
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Ahmad      Khan    23452   freshman        4
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Selam      Can     23431   freshman        3
Birth Date: December 5, 1987
Matric Date: December 5, 1987
Student Info:Andrew     Rosenberg       34523   Senior  4
Birth Date: December 5, 1987
Matric Date: December 5, 1987

SamJason124542
CanSelam23431

Я попробовал это

bool StudentSort(Student* lhs, Student* rhs) {
    return (*lhs)<(*rhs);
}



void Roster::mySort(){
        sort(roster_list.begin(),roster_list.end(),StudentSort);
};

все еще не работает, я получаю ошибку компиляции У меня есть версия gcc 4.4.7 20120313 (Red Hat 4.4.7-3) (GCC)

это ошибка, которую я получаю после этой попытки:

Roster.cpp: In member function ‘void Roster::mySort():
Roster.cpp:69: error: argument of type ‘bool (Roster::)(Student*, Student*) does not match ‘bool (Roster::*)(Student*, Student*)
  • 3
    Проблема в том, что вы храните указатели, поэтому ваш оператор меньше чем никогда не используется в сортировке. Вместо этого используется простое сравнение указателей. Лучшим решением было бы не хранить указатели. Кажется, нет никаких причин для этого.
  • 0
    К этому мы можем добавить, что критерий сортировки содержит ошибки, добавление разных ключей сортировки работает не во всех случаях, вы должны сравнивать каждый ключ по отдельности.
Показать ещё 2 комментария
Теги:
c++11

2 ответа

2

Ваш вектор/список содержит только Student*, а не Student. Итак, вам нужно будет указать Std :: sort что-то, что правильно сравнивает Student*. Как бы то ни было, сортировка по умолчанию, вероятно, будет сортироваться по ячейке памяти, а не по смысловому значению указанного объекта.

// assumes operator< above,which it doesnt.
bool StudentSortFn(Student* lhs, Student* rhs) {
    return (*lhs)<(*rhs);
}

Разумеется, оказывается, что исходный operator< имеет в себе ту же самую проблему. Его сравнение полей char* на основе значений указателя (адресов памяти), а не семантического содержимого. Его нужно переписать для использования strcmp или чего-то подобного:

 bool Student::operator<(const Student &second){
        return strcmp(comp,second.comp)<0;
    };
  • 0
    когда я вызываю void Roster :: mySort () {sort (roster_list.begin (), roster_list.end (), StudentSortFn); }; Я все равно получаю ошибку
  • 0
    @ user103421 Если вы не скажете, в чем ошибка, никто не сможет вам помочь.
Показать ещё 2 комментария
1

Трудно сортировать учеников, когда ваш вектор является вектором указателей. Простой способ - переписать без указателей

vector<Student> roster_list;

void Roster::addStudent(Student student){

    roster_list.push_back(student); 

    };

int main(){

    Roster r;
    Date d(12,05,1987);
    Student st("Jason", "Sam", "124542", "sophomore", 34, 4.0, d,d);
    Student st2("Ahmad", "Khan", "23452", "freshman", 34, 4.0, d,d);

    Student st3("Selam", "Can", "23431", "freshman", 34, 3.0, d,d);
    Student st4("Andrew", "Rosenberg", "34523", "Senior", 34, 4.0, d,d);
    Student st5("Selam", "Can", "23431", "freshman", 34, 3.0, d,d);

    r.addStudent(st);
    r.addStudent(st2);
    r.addStudent(st3);
    r.addStudent(st4);

и т.д.

  • 1
    Это хорошее решение для многих обстоятельств, но вам может потребоваться / понадобиться указатель для последующего применения полиморфизма, и сортировка векторов указателей не сложна, для этого просто требуется предоставить короткую, легко написанную функцию сравнения, которая занимает два объекта Student *, и возврат ответа базируется на содержании указанных объектов.
  • 0
    @RichardPlunkett Как вы думаете, OP освобождает всю память, которую он выделяет? Когда он понимает, что это желательно сделать, как вы думаете, как легко он его найдет? Простой способ - не использовать указатели.
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню