Сортировка в с++

340
23 декабря 2018, 11:40

Недавно начал програмировать на с++ и возник вопрос. Написал программу которая показывает список учеников и их оценки. Создал два вектора для имени и оценки. Интересует вопрос как отсортировать список по убыванию оценок студентов (сначала самый высокий бал). Затем вывести все имена и оценки в отсортированном виде.(отсортировать могу,но не могу связать имя и оценку)`

#include "stdafx.h"
#include <iostream>
#include <string>
#include "std_lib_facilities.h"
  vector<string> name_of_students;
  vector<double> marks_of_students;
void name() {
   cout << "Type the name of student ";
   string name;
   cin >> name;
   name_of_students.push_back(name);
}
int mark() {
  cout << "Type the mark of this student";
  int mark;
  cin >> mark;
  marks_of_students.push_back(mark);
  return mark;
}
 void main(){
   cout << "How many student in your class?";
   int number_of_students;
   cin >> number_of_students;
   for (int i = 0; i < number_of_students; i++) {
    name();
    mark();
}
 cout << "Number of students is " << name_of_students.size() << " 
 people.\n";
 for (int i = 0; i < name_of_students.size(); i++) {
    cout << name_of_students[i] << " " << marks_of_students[i] << "marks\n";
}
keep_window_open();
}
Answer 1

Для таких вещей принято вместо использования двух объектов, использовать один. Тобишь список оценок - это, по сути, один объект, в котором есть список учеников, каждому из которых присвоены оценки. Таким образом, лучше сделать структуру (на самом деле есть вариант получше, но это сложнее, я напишу ниже). Что-то вроде:

class Student {
   private:
   std::string name_;
   unsigned short digit_;
   public:
    //сдесь конструктор и функции
}

В результате вам нужно будет создать один вектор, а не два. А дальше начинается интересное. В стандартной библиотеке есть функция sort, которая принимает итератор на начало, конец и предикат. Если что-то из этого не знакомо - что ж, придется познакомится.

Итак, далее пишем:

std::vector<Student> list;
...
std::sort(list.begin(), list.end(), 
  [](const Studeng &a, const Student &b){return a.digit() < b.digit();});

Метод digit, я думаю, сами сможете реализовать. Кстати, если не знаете что за конструкция приведена - это лямбда. Можно поступить по другом: определить operator< в классе соответствующим образом, и тогда предикат можно опустить. Так, кстати говоря, почти любой контейнер можно отсортировать (кроме тех, которые сами элементы упорядочивают).

Выше я писал о лучшем методе: это использовани map, но думаю, это будет еще сложновато для вас. Вкратце, для использования map (или, если использовать эту структуру, то можно и set обойтись) обязательно нужно указать либо operator < в классе, либо при инициализации контейнера указать предикат. В этих классах, благодоря древовидной структуре, элементы сами упорядочиваются.

Answer 2

У вас есть заполненный вектор для оценок студентов:

vector<double> marks_of_students;

И в пространстве имен std определены некоторые функторы для облегчения решений подобных задач. Один из них std::greater_equal. Вам остается только сортировать ваш вектор по такому критерию, и никакие струтуры не нужны.

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

 std::sort(marks_of_students.begin(), marks_of_students.end(),
                   std::greater_equal<double>());

и используйте наздоровье...

READ ALSO
C++ глобальный enum [закрыт]

C++ глобальный enum [закрыт]

Как создать enum который будет доступен везде? Я вот например создал enum и с ним все нормально работает в классах где создаю а вот в класе наследнике...

193
Парсинг и изменение даты в кастомном формате

Парсинг и изменение даты в кастомном формате

Есть строка с датой и времнем в определенном формате

164
Пример Spring Boot programmatic transaction, spring data jpa

Пример Spring Boot programmatic transaction, spring data jpa

Ищу пример реализации программного управления транзакциями в Spring Boot и Spring Data JPAВезде только для spring framework

168
Неясный стек исключений в приложении javaFx

Неясный стек исключений в приложении javaFx

Коллеги, добрый день! Вот такой стек исключения выдается при запуске собранного мавеном джарника моего приложения:

169