Сортировка карты объектов C ++ - PullRequest
0 голосов
/ 22 ноября 2018

У меня есть проект, в котором у меня есть файл игры, который содержит объекты роботов.Файл игры сохраняет объекты робота, используя карту.Карта содержит имя робота в качестве ключа, а значение - объект робота.

Роботы находятся в двухмерном пространстве, и у них есть x, y, чтобы найти свою текущую позицию.

Одна из функций, которую я должен реализовать, - сортировать роботов от самых маленьких до самых больших, находякак далеко они находятся от исходной точки (0, 0).

Это моя карта:

 std::map<std::string, robot> robot_map;

Я инициализирую робота с именем и двумя переменными, чтобы узнать местоположение итретий, чтобы найти общее количество предпринятых шагов:

robot::robot(const string &n) : robot_name(n) { x = 0, y = 0, t = 0; }

И чтобы проверить расстояние робота от источника, я использую это:

 std::string game::furthest() const
    {
    int furthest = 0;
    std::string max_name; 

    typedef std::map<std::string, robot>::const_iterator iter;
    for (iter p = robot_map.cbegin(); p != robot_map.cend(); ++p) {

        if (distance(p->second) > furthest) {
            furthest = distance(p->second);
            max_name = p->first;
        }
    }

    return max_name;
    }

И это функция расстояния:

int distance(const robot &r) {
    int distance;
    int y = r.north();
    int x = r.east();

    distance = abs(x - 0) + abs(y - 0);

    return distance;
}

В моей последней функции я хотел бы отсортировать их по вектору, вот что у меня сейчас есть:

std::vector<robot> game::robots_by_travelled() const
{
    std::vector<robot> robots;


    int furthest = 0;

    typedef std::map<std::string, robot>::const_iterator iter;

    for (iter p = robot_map.cbegin(); p != robot_map.cend(); ++p) {
        robots.push_back(p->second);
    }


    return robots;
    ;
}

Есть ли способ отсортировать вектор по их расстоянию от начала координат(0, 0)?

1 Ответ

0 голосов
/ 22 ноября 2018

Да, есть std::sort, который будет сортировать по любому подходящему отношению:

std::sort(robots.begin(), 
          robots.end(),
          [](const robot& lhs, const robot& rhs) 
            { return distance(lhs) < distance(rhs); });

или, если вы хотите использовать предикат многократного использования:

bool closer(const robot& r1, const robot& r2)
{
    return distance(r1) < distance(r2);
}

// ...
std::sort(robots.begin(), robots.end(), closer);

Вы может также перегрузить оператор < и просто сказать

std::sort(robots.begin(), robots.end());

, но это имеет больше смысла, когда у вас есть объекты, которые можно осмысленно сказать «меньше» друг друга, и вы хотите < и в других ситуациях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...