C++对指针向量进行排序,其中对象表示矩阵坐标
C++ Sort a vector of pointers in which the objects represent matrix coordinates
我读到一个文件,其中的矩阵用0、1和2填充。当我找到1时,我会创建一辆BlueCar,当2时,我创建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;
考虑到我需要移动矩阵中的车,蓝色的车向下移动,红色的车向右移动,我认为最好的方法是对这些向量进行排序。这样,我可以很快看到我正在考虑的汽车旁边的位置是否是空的。
由于蓝色汽车向下移动,我认为最好先按列然后按行对"sparseLu"进行排序,而不是先按行然后按列对"sparceRed"进行排序。
我怎样才能达到这个结果?当我一辆车接一辆地填充向量时,立即对向量进行排序(就性能而言)会更好,对吧?
简短回答:
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++中没有垃圾回收。
std::sort
有一个重载版本,带有比较器-一个用于比较两项的自定义函数:http://en.cppreference.com/w/cpp/algorithm/sort,因此您可以指定任何比较。
此外,您可以考虑将汽车存储在稀疏矩阵(std::vector<std::vector<Car>>
)中,其中空单元格就是空的。因此,您不需要排序,只需在相应的单元格为空时查看即可。
相关文章:
- 具有引用成员的结构是否具有唯一的对象表示形式
- 将 boost 序列化对象的 asio::streambuf 表示转换为 Beast 的 DynamicBody req.body()
- 如何在C++中表示JSON文档的递归对象结构?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 广义 std::function (std::any 表示可调用对象)
- reinterpret_cast可以更改对象表示吗?
- 当表示为对象的一维向量时,有效地旋转 NxM 矩阵 (C++)
- 流对象来表示文件输入,然后是标准输入?
- 在Python中构建类似于__repr__的对象的可打印表示
- ptrdiff_t可以表示指向同一数组对象元素的指针的所有减法吗?
- std::any 表示无法复制构造的对象
- 可以从指向子对象的指针中获取指向完整对象表示元素的指针吗
- 指向对象表示元素或指向提供的存储元素的指针
- 如何将3D .OBJ对象表示为3D数组
- C++设计中,如何用对象表示协议的不同阶段
- 当对象表示硬件组件时,我应该使用指向对象的指针吗
- 与地址空间无关的对象表示
- C++对指针向量进行排序,其中对象表示矩阵坐标
- 对象表示形式的定义和运算符sizeof
- 如何将一组C++动态分配的对象表示为BGL(Boost Graph Library)图,以获得它们的依赖图