8

我正在尝试将对象 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
}
4

3 回答 3

18

您需要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;
}
于 2013-11-09T02:30:06.897 回答
2

std::set<T>要求std::less<T>以值类型而闻名T。这样它就可以对其元素进行排序,这是其内部工作方式的基础。

bool operator<(const Point2D&, const Point2D&)只要满足Strict Weak Ordering就可以通过定义 , 使用您选择的任何逻辑来解决此问题。

这是类型的要求,但是一旦你完成了这个,你就可以开始了。

于 2013-11-09T02:29:39.893 回答
2

我相信 C++ 11 或更新版本定义顺序的更好方法是使用自定义函子,因为 std::set 支持。

我们可以看到set在 header 中定义<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;
于 2015-02-05T01:58:02.667 回答