排序对象图C ++

时间:2018-11-22 15:52:00

标签: c++ sorting vector

我有一个项目,其中有一个包含机器人对象的游戏文件。游戏文件使用地图保存机器人对象。该映射包含机器人的名称作为键,值是机器人对象。

机器人位于2D空间中,它们具有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 :(得分:5)

是的,有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());

但是当您拥有可以有意义地称为彼此“小于”的对象并且在其他情况下也希望<时,这更有意义。