rstJkee
@rstJkee

Как создать компоратор для вектора структур?

Задача состоит в том, чтобы создать список учеников, который будет содержать фамилию и сумму баллов за 3 экзамена (e1, e2, e3). Есть код
#include <iostream>
#include <vector>
#include <cstdlib>

using namespace std;

struct s
{
	string name;
	int balli;
};

int cmp(const void* a, const void* b)
{
	return a.name < b.name;
}

int main()
{
	vector<s> v;
	int n = 0;
	cin >> n;
	v.reserve(n);
	int e1, e2, e3;
	string name;
	for (int i = 0; i < n; i++)
	{
		cin >> name;
		cin >> e1;
		cin >> e2;
		cin >> e3;
		int bal = e1 + e2 + e3;
		v.push_back({ name, bal });
	}
	qsort(v.data(), v.size(), sizeof(s), cmp);
	for (vector<s>::iterator it = v.begin(); it != v.end(); it++)
	{
		cout << (*it).name << " " << (*it).balli << "\n";
	}
	return 0;
}


Надо отсортировать сначала по убыванию баллов, а затем, если у некоторых учеников баллы одинаковые, то в алфавитном порядке их фамилии. Помогите написать компоратор для этого дела или объясните, что можно написать по-другому.
  • Вопрос задан
  • 542 просмотра
Решения вопроса 1
rstJkee
@rstJkee Автор вопроса
Короче, спасибо за помощь, дай бог здоровья человеку с ником res2001, который дал богоподобный ответ. Видимо чел всю жизнь сидит на плюсах и не понимает, что есть люди, которые развиваются в другом направлении, а плюсы юзают, чтобы выполнить задание, в котором требуется быстрота выполнения

Вот компоратор, который у меня получился, для структуры s

struct s
{
  string name;
  int balli;
};

bool cmp(s a, s b) {
  if (a.balli > b.balli)
    return true;
  else 
    if (a.balli == b.balli && a.name < b.name)
      return true;
    else
      return false;
}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@res2001
Developer, ex-admin
Помогите написать компоратор для этого дела или объясните, что можно написать по-другому.

Какие проблемы то?
Вот как описал сам процесс сравнения так и реализуешь компаратор.
Т.е. сначала проверяешь баллы. Если баллы не равны, сразу возвращаешь соответствующее значение.
Если баллы равны начинаешь проверять name.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы