Computernerd
Computernerd

Reputation: 7766

How do I insert user-defined objects into STL set?

I am trying to insert a object Point2D into a Point2D set but i am not able to do it, it seems the set works for int and char but not for objects.

I need help to know how to insert objects into the set ??? Assuming i want to sort them by ascending order of x value

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
}

Upvotes: 10

Views: 27085

Answers (3)

Carlos Sanchez
Carlos Sanchez

Reputation: 1016

You need to implement the operator< overload for your class. For instance, in your class, you can do:

friend bool operator< (const Point2D &left, const Point2D &right);

Then, outside your class:

bool operator< (const Point2D &left, const Point2D &right)
{
    return left.x < right.x;
}

Edit: As suggested by Retired Ninja, you can also implement this as a regular member-function within your class:

bool operator< (const Point2D &right) const
{
    return x < right.x;
}

Upvotes: 22

user2558887
user2558887

Reputation:

I believe a better way for C++ 11 or newer to define the order is to use custom functor, since std::set support that.

We can see set is defined in header <set> like this:

template<
    class Key,
    class Compare = std::less<Key>,
    class Allocator = std::allocator<Key>
> class set;

Hence, to compare based on x for example:

struct Point2DCmp
{
    bool operator() (Point2D& p1, Point2D& p2)
    {
        return p1.getX() < p2.getX();
    }
}

set<Point2D, Point2DCmp> P2D;

Upvotes: 2

Lightness Races in Orbit
Lightness Races in Orbit

Reputation: 385174

std::set<T> requires that std::less<T> is known for the value type T. This is so that it can order its elements, which is fundamental to how it works internally.

Fix this by defining bool operator<(const Point2D&, const Point2D&), with any logic you choose as long as it satisfies the Strict Weak Ordering.

This is a requirement of the type, but once you've done this you're good to go.

Upvotes: 3

Related Questions