【发布时间】:2021-12-06 20:43:35
【问题描述】:
我有一个类ShapeDisplay,它存储了一组Rectangles。我想将它们排序存储,因此我使用std::set。我的目的是提供一个自定义比较器,它将矩形的原点 (x, y) 与显示中的参考点 (x, y) 进行比较。
但是,为了实现这一点,比较器需要访问m_reference。如何使用需要访问类成员的自定义比较器?我的设计有缺陷吗?我知道有更新的方法可以将比较器提供为in this link,,但这并不能解决我的访问问题。
或者,我可以只保留一个 std::vector 并保持排序,这样每个新的 Rectangle 都会插入到正确的位置。但是由于std::set::insert() 应该使用自定义比较器自动执行此操作,所以我更愿意这样做。
谢谢。
struct Point
{
int x;
int y;
};
struct Rectangle
{
int x;
int y;
int width;
int height;
};
class ShapeDisplay
{
void insertShape(Rectangle rect)
{
m_shapes.insert(rect);
}
void setReference(Point reference)
{
m_reference = reference;
}
private:
struct CenterComparator
{
bool operator() (const Rectangle & a, const Rectangle & b) const
{
double distA = std::sqrt(std::pow(a.x - m_reference.x, 2)
+ std::pow(a.y - m_reference.y, 2));
double distB = std::sqrt(std::pow(b.x - m_reference.x, 2)
+ std::pow(b.y - m_reference.y, 2));
return distA < distB;
}
};
std::set<Rectangle, CenterComparator> m_shapes;
Point m_reference;
};
【问题讨论】:
-
set排序或免费,但它存储数据的方式使得遍历速度明显慢于vector。如果你做的遍历多于插入,那么简单的插入可能是一个失败的提议。
标签: c++ set comparator