Сортирование list с пользовательским типом данных c++
Доброе утро, не получается отсортировать по убыванию.
class Student
{
public:
string name;
int age;
public:
Student(string Name, int Age) { name = Name; age = Age; }
Student() {};
friend std::ostream& operator<< (std::ostream &out, const Student &point);
};
std::ostream& operator<< (std::ostream &out, const Student &point)
{
out << point.name << ", " << to_string(point.age) << endl;
return out;
}
void sort(vector<Student> &v) {
int k = v.size();
Student temp;
for (int i = 0; i < k; i++)
for (int j = i + 1; j < k; j++)
if (v[i] < v[j])
{
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
bool operator < (Student &a, Student &b)
{
Student temp; Student temp2;
if (temp.age < temp2.age) return temp.age;
else return temp2.age;
}
int main()
{
setlocale(LC_ALL, "Russian");
vector<Student> list;
list.emplace_back("Иванов", 45);
list.emplace_back("Петров", 30);
list.emplace_back("Сидоров", 55);
list.emplace_back("Коробков", 45);
list.emplace_back("Ермолаев", 30);
list.emplace_back("Витушкин", 55);
sort(list);
for (auto i = list.begin(); i != list.end(); i++)
{
cout << *i;
}
Ошибка : error C2678: бинарный "<": не найден оператор, принимающий левый операнд типа "_Ty" (или приемлемое преобразование отсутствует);
Ответы (2 шт):
Во-первых: не используйте using namespace std. Вот вы используете функцию sort - а какую вы юзаете: из стандартной библиотеки или свою самописную? Ладно еще в вашем случае сигнатуры не сходятся, но это ОЧЕНЬ плохая практика.
Во-вторых, так как вы используете все-таки свою не шаблонную функцию sort, то возникает вопрос: а откуда она знает как сравнивать ваши объекты? Вы сказали что создали operator<, но, позвольте, а откуда ваша функция о нем знает? У вас нету объявления этой функции, а определение ниже функции sort. Добавте объявление перед sort или вынесите туда определение
Любой конструктор класса должен инициализировать свои не
инициализированные члены, в том числе и конструктор по умолчанию
вашего класса. Например так:Student::Student() :name(" "), age(0) {};Оператор сравнения выполняет какие то действия, не связанные с передаваемыми объектами, которые нужно сравнивать, и не принимает ни константные объекты,ни временные объекты. А также возвращает не результат сравнения, а информацию об отличии от нуля члена какого то объекта, в данном случаи возраста какого то постороннего студента, который к тому же не существует. Оператор нужно переписать:
bool operator < (const Student& a, const Student& b) { return a.age < b.age; }Только после определения этого оператора можно написать вашу функцию сортировки, дабы она знала как сравнивать. Но в условии цикла сравнения нужно определиться. Если вы хотите сортировать вектор от меньшего к большему, то менять местами тогда, когда сравниваемый элемент меньше, а не когда меньше тот, с чем сравниваете:
void sort(vector<Student>& v) { int k = v.size(); Student temp; for (int i = 0; i < k; i++) for (int j = i + 1; j < k; j++) if (v[j] < v[i]) //исправлено { temp = v[i]; v[i] = v[j]; v[j] = temp; } }
Но лучше использовать стандартный алгоритм сортировки:
void sort(vector<Student>& v) {
std::sort(v.begin(), v.end());
}