我正在尝试将Point2D对象插入到Point2D集中,但是我无法做到这一点,看起来该集合适用于int和char但不适用于对象。
我需要帮助才能知道如何将对象插入到集合中???假设我想按x值的升序排序它们
class Point2D
{
public:
Point2D(int,int);
int getX();
int getY();
void setX(int);
void setY(int);
double getScalarValue();
protected:
int x;
int y;
double distFrOrigin;
void setDistFrOrigin();
};
int main()
{
Point2D abc(2,3);
set<Point2D> P2D;
P2D.insert(abc); // i am getting error here, i don't know why
}
答案 0 :(得分:11)
您需要为您的班级实施operator<
重载。例如,在你的课堂上,你可以这样做:
friend bool operator< (const Point2D &left, const Point2D &right);
然后,在课外:
bool operator< (const Point2D &left, const Point2D &right)
{
return left.x < right.x;
}
编辑:根据Retired Ninja的建议,您也可以将其作为班级中的常规成员函数实现:
bool operator< (const Point2D &right) const
{
return x < right.x;
}
答案 1 :(得分:2)
std::set<T>
要求std::less<T>
以值类型T
而闻名。这样它就可以对其元素进行排序,这对于它在内部的工作方式至关重要。
通过定义bool operator<(const Point2D&, const Point2D&)
,使用您选择的任何逻辑来解决此问题,只要它满足Strict Weak Ordering。
这是该类型的要求,但是一旦你完成了这个,你就可以去了。
答案 2 :(得分:2)
我相信C ++ 11或更新版本定义订单的更好方法是使用自定义函数,因为std :: set支持。
我们可以在标题<set>
中定义 set ,如下所示:
template<
class Key,
class Compare = std::less<Key>,
class Allocator = std::allocator<Key>
> class set;
因此,基于x进行比较,例如:
struct Point2DCmp
{
bool operator() (Point2D& p1, Point2D& p2)
{
return p1.getX() < p2.getX();
}
}
set<Point2D, Point2DCmp> P2D;