C++ Найти наибольший элемент у объекта для сравнения с другими объектами
У меня есть Класс Person, у которого есть свойства: Имя, Фамилия, Год, Род занятий.
#ifndef PROJECT_TASK_INCLUDED
#define PROJECT_TASK_INCLUDED
#include <iostream>
#include <string>
class Person {
public:
Person(); //конструктор
// void calculed_last_person(int);
void create_new_person(); //создание персоны
void stream_persons(); //вывод персоны
int get_year(); // получить год
private:
std::string name; //имя
std::string last_name; //фамилия
int year; //год
std::string occupation; //род занятий
};
#endif
Не особо важная, но может быть кому-то нужная информация определения функций:
#include <iostream>
#include <string>
#include <task.hpp>
Person::Person(){
}
void Person::create_new_person()
{
std::cout << "Enter Name Person" <<std::endl;
std::cin >> Person::name;
std::cout << "Enter Last Name Person" << std::endl;
std::cin >> Person::last_name;
std::cout << "Enter year of admission" << std::endl;
std::cin >> Person::year;
std::cout << "Enter person occupation" << std::endl;
std::cin >> Person::occupation;
}
void Person::stream_persons()
{
std::cout << "name: " << name << std::endl;
std::cout << "last_name: " << last_name << std::endl;
std::cout << "year: " << year << std::endl;
std::cout << "occupation: " << occupation << std::endl;
}
int Person::get_year()
{
return year;
}
Из трех созданных объектов я хочу найти последний (наибольший) год, для того, чтобы потом его показать, но попытки использовать функцию minmax_element() не обвенчаются успехом, происходит ошибка компиляции (компилятор g++).
#include <iostream>
#include <task.hpp>
#include <string>
#include <algorithm>
int main() {
int num = 3;
Person *person = new Person;
// Person array[3];
Person *array = new Person[num];
std::cout << "Start program" << std::endl;
std::cout << "Select an action" << std::endl;
int p;
bool t = false;
do {
std::cin >> p;
switch(p)
{
case 1:
std::cout << "create person" << std::endl;
for (int i=0; i<num; i++) {
person->create_new_person();
array[i] = *person;
std::cout << "Done! " << "iteration: " << i << std::endl;
}
break;
case 2:
std::cout <<"stream person" << std::endl;
for (int i=0; i<num; i++) {
array[i].stream_persons();
}
break;
case 3:
{const auto [min, max] = std::minmax_element(std::begin(array->get_year()), std::end(array->get_year()));
std::cout << "last year: " << *max << std::endl;}
break;
case 4:
t = true;
break;
default:
std::cout << "Select an action" << std::endl;
break;
}
}while(!t);
delete person;
delete []array;
return 0;
}
Я знаю как использовать функцию std::minmax_element() с обычным массивом, хранящий типы int, но вот как использовать его с объектом, я без понятия. Перепробовал много способов, которые тоже провалились. Есть ли другие способы вытянуть из объекта его свойство для сравнения с такими же объектами, а точнее их свойствами?
Ответы (1 шт):
Вам нужно передавать в std::minmax_element() компаратор, который сравнивает Person по полу year:
std::minmax_element(array, array+num,
[](const Person& a, const Person& b)
{ return a.get_year() < b.get_year(); });
Если, конечно, у вас в массиве все num элементов заполнены...