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 шт):

Автор решения: Harry

Вам нужно передавать в 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 элементов заполнены...

→ Ссылка