Не сортируется вектор, что делать?
Условие:
На вход программе подаются сведения о сдаче экзаменов учениками 9-х классов некоторой средней школы. В первой строке сообщается количество учеников N, которое не меньше 10, но не превосходит 100, каждая из следующих N строк имеет следующий формат: <Фамилия> <Имя> <оценки>, где <Фамилия> - строка, состоящая не более чем из 20 символов, <Имя> — строка, состоящая не более чем из 15 символов, <оценки> - через пробел три целых числа, соответствующие оценкам по пятибалльной системе. <Фамилия> и <Имя>, а также <Имя> и <оценки> разделены одним пробелом. Пример входной строки:
Иванов Петр 4 2 4
Требуется написать как можно более эффективную программу (укажите используемую версию языка программирования, например, Borland Pascal 7.0), которая будет выводить на экран фамилии и имена неуспевающих учеников (имеющих по результатам экзаменов хотя бы одну двойку), располагая их в порядке уменьшения числа двоек.
#include <iostream>
#include <string>
#include <vector>
#include <iomanip>
#include <algorithm>
class Losers
{
public:
std :: string name, lastname;
int priority;
Losers () : priority ( 0 ) { }
void error ()
{
std :: cout << "Error!" << std :: endl;
}
};
int main ( void )
{
int numbers;
std :: string name, lastname;
int one, two, three;
Losers error;
std :: vector <Losers> losNL ( 0 );
std :: cin >> numbers;
if ( numbers > 2 && numbers < 100 )
{
for ( int i = 0; i < numbers; ++i )
{
std :: cin >> std :: setw ( 15 ) >> name;
std :: cin >> std :: setw ( 20 ) >> lastname;
std :: cin >> one >> two >> three;
bool protectOne = one == 2 || one == 3 || one == 4 || one == 5;
bool protectTwo = two == 2 || two == 3 || two == 4 || two == 5;
bool protectThree = three == 2 || three == 3 || three == 4 || three == 5;
if ( protectOne && protectTwo && protectThree )
{
if ( one == 2 || two == 2 || three == 2 )
{
losNL.resize ( losNL.size () + 1 );
losNL[ i ].name = name;
losNL[ i ].lastname = lastname;
if ( one == 2 && two == 2 && three == 2 )
{
losNL[ i ].priority = 3;
}
if ( one == 2 && two == 2 || one == 2 && three == 2 || two == 2 && three == 2 )
{
losNL[ i ].priority = 2;
}
if ( one == 2 || two == 2 || three == 2 )
{
losNL[ i ].priority = 1;
}
}
else
{
--i; --numbers;
}
}
else
{
error.error ();
}
}
}
else
{
error.error ();
}
std::sort ( losNL.begin (), losNL.end (), []( const Losers & a, const Losers & b )
{
return ( a.priority < b.priority );
});
for ( int i = 0; i < losNL.size (); ++i )
{
std :: cout << losNL[ i ].name << " " << losNL[ i ].lastname << std :: endl;
}
return 0;
}