2013-11-24 3 views
0

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

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

Проблема заключается в том вы хранение указателей, так что ваш менее чем оператор никогда не используется в этом роде. Вместо этого используется простое сравнение указателей. Лучшим решением было бы не хранить указатели. Кажется, нет причин для этого. – juanchopanza

+0

К этому мы можем добавить, что критерий сортировки прослушивается, добавление разных ключей сортировки не работает во всех случаях, вы должны сравнивать каждый ключ отдельно. – john

+0

Вы не дали нам определения типа Student, поэтому его немного сложно прокомментировать, как писать функции, которые работают на нем. – RichardPlunkett

ответ

1

трудно разобраться Студенты, когда ваш вектор является Vect или указателей. Простой способ переписать без указателей

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

Это хорошее решение для многих ситуаций, но вам могут понадобиться указатели для дальнейшего применения полиморфизма, а сортировка векторов указателей не является сложной задачей, она просто требует, чтобы вы предоставили короткую, легко написанную compare, которая принимает два Student *, и возвращает базы ответов на содержание объектов, указывающих на объекты. – RichardPlunkett

+0

@RichardPlunkett Как вы думаете, OP освобождает всю память, которую он выделяет? Когда он понимает, что желательно сделать это, как легко, как вы думаете, он найдет его? Простым способом является использование указателей. – john

+0

no Я подозреваю, что он не освобождает его. Он надеется создать объекты так, как может программист Java, и я ожидаю, что все это пойдет в ад. Да, простой способ не использовать указатели в большинстве/всех местах, где он их использует. Сеантика значения и класс std :: string позволили бы этой ярмарке с большей вероятностью работать в первый раз. – RichardPlunkett

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); }; Я получаю ошибку – user103421

+0

@ user103421 Если вы не скажете, что ошибка никто не сможет вам помочь. – john

+0

ok, user103421 Я немного изменил свой ответ, теперь должен быть ближе :) – RichardPlunkett

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