如何将对象插入STL集

时间:2013-11-09 02:21:10

标签: c++ stl set

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

3 个答案:

答案 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;