Сортировка вектора различных объектов класса на основе их переменных-членов - PullRequest
0 голосов
/ 07 мая 2020

Допустим, у меня есть такой код

#include <iostream>
#include <vector>
#include <memory>
#using namespace std;

class animal{
protected:
int height;
int speed;
};

class horse:public animal{
public:
horse(){
  height=200;
  speed=75;
 }
};
class cat:public animal{
public:
cat(){
    height=30;
    speed=20;
 }
};
class dog:public animal{
public:
 dog(){
    height=55;
    speed=35;
  }
};

int main() {
std::vector<std::unique_ptr<animal>>animalvector;
animalvector.emplace_back((unique_ptr<animal>(new horse)));
animalvector.emplace_back((unique_ptr<animal>(new cat)));
animalvector.emplace_back((unique_ptr<animal>(new dog)));

return 0;
}

Я хочу отсортировать этот вектор животных в порядке убывания в зависимости от скорости этих разных животных. Как лучше всего это сделать?

1 Ответ

0 голосов
/ 07 мая 2020

Вы можете использовать std::sort из <algorithm> с лямбда-функцией, определяющей ваш предикат сортировки.

std::sort(animalvector.begin(),
          animalvector.end(),
          [](auto const& lhs, auto const& rhs)
{
     return lhs->speed > rhs->speed;
});

Обратите внимание, что speed либо должно быть public, либо вам понадобится publi c функция получения. Если вы хотите добавить методы получения

class animal
{
public:
    int GetHeight() const { return height; }
    int GetSpeed() const { return speed; }
protected:
    int height;
    int speed;
};

, вы бы изменили лямбда, чтобы использовать эти методы получения

std::sort(animalvector.begin(),
          animalvector.end(),
          [](auto const& lhs, auto const& rhs)
{
     return lhs->GetSpeed() > rhs->GetSpeed();
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...