Сортировка вектора указателей классов на основе двух атрибутов? - PullRequest
1 голос
/ 02 августа 2020

Я пытаюсь отсортировать свой вектор указателей классов vector <Building*> company. Ниже мой код

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return (lhs->getCompanyName() > rhs->getCompanyName() && lhs->height() > rhs->height());
}); 

. Я пытаюсь отсортировать на основе двух атрибутов в классе с именами getCompanyName() и height(). getCompanyName должен располагаться в алфавитном порядке от A до Z, а height - в порядке убывания.

Вышеупомянутая сортировка не работает.

Однако, если я разделю два условия вверх на два ниже:

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->getCompanyName() > rhs->getCompanyName();
}); 

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->height() > rhs->height();
}); 

Вектор будет отсортирован правильно, но только на основе одного атрибута.

Что-то не так с моим кодом сортировки 2 атрибутов?

Изменить:

getCompanyName() будет отсортировано первым на основе AZ.

Только после того, как getCompanyName() будет отсортировано, height() будет отсортировано в порядке убывания.

Пример отсортированного ожидаемого вывода:

Company Name: AQA
Height: 300

Company Name: AFE
Height: 200

Company Name: BAC
Height: 600

Company Name: BFE
Height: 100

Company Name: CJE
Height: 1200

Ответы [ 2 ]

2 голосов
/ 02 августа 2020

Типичный шаблон:

return 
(lhs->getCompanyName() > rhs->getCompanyName()) || 
(lhs->getCompanyName() == rhs->getCompanyName() &&
    lhs->height() > rhs->height());

Это: сначала сортировать по имени, затем по высоте, если имена совпадают.

2 голосов
/ 02 августа 2020

Если вы хотите отсортировать сначала , увеличивая значения getCompanyName() и , затем , уменьшая значения height(), ваш предикат должен быть:

sort(company.begin(), company.end(), [] (Building* lhs, Building* rhs)
{
    return lhs->getCompanyName() < rhs->getCompanyName()    // increasing getCompanyName()
        || (lhs->getCompanyName() == rhs->getCompanyName()  // if equal getCompanyName() 
            &&  lhs->height() > rhs->height());             // then decreasing height()
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...