C ++对指针向量进行排序,其中对象表示矩阵坐标

时间:2016-01-04 10:38:45

标签: c++ sorting matrix vector

我读了一个矩阵填充0,1和2的文件。 当我找到1时我创建一个BlueCar,当我创建一个RedCar时:

class BlueCar : public Car
{
    public:
        BlueCar(){};
        BlueCar(int x, int y);
        void move();
        virtual ~BlueCar();
};
class RedCar : public Car
{
    public:
        RedCar(){};
        RedCar(int x, int y);
        void move();
        virtual ~RedCar();
};
class Car
{
    public:
        Car();
        Car(int x, int y);
        virtual ~Car();
        virtual void move() = 0;

    private:
        int x,y;
};

使用这个对象,我填充两个向量:

    std::vector<BluCar*> *sparseBlu;
    std::vector<RedCar*> *sparseRed;

考虑到我需要移动矩阵的汽车,并且蓝色向下移动而红色向右移动,我认为最好的方法是对这些向量进行排序。通过这种方式,我可以快速看到我正在考虑的汽车旁边的位置是否为空。

由于蓝色汽车向下移动,我认为最好先按行排序“sparseBlu”,然后按行排序,而不是先按行排序“sparseRed”,再按列排序。

我怎样才能达到这个效果? 当我把汽车装满汽车时,最好(在性能方面)对矢量进行排序,对吗?

2 个答案:

答案 0 :(得分:1)

简短回答:

std::sort(std::begin(*sparseBlu), std::end(*sparseBlu),
          [](const BlueCar* lhs, const BlueCar* rhs) -> bool {
              return lhs->get_x() < rhs->get_x() ||
                     (lhs->get_x() == rhs->get_x() && lhs->get_y() < rhs->get_y());
          });

std::sort(std::begin(*sparseRed), std::end(*sparseRed),
          [](const RedCar* lhs, const RedCar* rhs) -> bool {
              return lhs->get_y() < rhs->get_y() ||
                     (lhs->get_y() == rhs->get_y() && lhs->get_x() < rhs->get_x());
          });

请重新考虑,如果在这里使用指针确实是你需要的。没有指针你就会减少噪音。

std::vector<BluCar> sparseBlu;
std::vector<RedCar> sparseRed;

std::sort(std::begin(sparseBlu), std::end(sparseBlu),
          [](const BlueCar& lhs, const BlueCar& rhs) -> bool {
              return lhs.get_x() < rhs.get_x() ||
                     (lhs.get_x() == rhs.get_x() && lhs.get_y() < rhs.get_y());
          });

std::sort(std::begin(sparseRed), std::end(sparseRed),
          [](const RedCar& lhs, const RedCar& rhs) -> bool {
              return lhs.get_y() < rhs.get_y() ||
                     (lhs.get_y() == rhs.get_y() && lhs.get_x() < rhs.get_x());
          });

如果您的应用程序中的这种排序很自然,您可能还会考虑重载operator < ()。这使得对sort()的调用更加明确:

std::sort(std::begin(sparseBlu), std::end(sparseBlu), std::less<BlueCar>);
std::sort(std::begin(sparseRed), std::end(sparseRed), std::less<RedCar>);

几乎是声明性的编程风格。

如果您因任何原因决定坚持使用指针,请考虑使用std::unique_ptr<>std::shared_ptr<>而不是原始指针来正确管理对象的生命周期。请记住,C ++中没有垃圾收集。

答案 1 :(得分:0)

std::sort有一个带比较器的重载版本 - 一个用于比较两个项目的自定义函数:http://en.cppreference.com/w/cpp/algorithm/sort,因此您可以指定任何比较。

此外,您可以考虑将您的汽车存储在稀疏矩阵(std::vector<std::vector<Car>>)中,其中空单元格只是空的。所以你不需要排序,只要它是空的就可以查看相应的单元格。