Question

I got:

"object.h"

namespace objectNS
{
    class object
    {
    public:
        int m_number;
        bool operator== (const object& object) const;
        bool operator< (const object& object) const;
    };
    class compare
    {
    public:
        bool operator ()(const object*, const object*) const;
    };
}

"object.cpp"

#include "object.h"
typedef objectNS::object OBJECT;
bool OBJECT::operator== (const object &object) const
{
    return this->m_number == object.m_number;
}

bool OBJECT::operator< (const object &object) const
{
    return this->m_number < object.m_number;
}

bool objectNS::compare::operator() (const object* obj1, const object* obj2) const
{
    return obj1->m_number > obj2->m_number;
}

I got some function which works with objects,

void f(void)
{
    set<Compound_object*> detectedObjects;
    set<Compound_object*> deleteFromTrackedObjects;
    set_difference(detectedObjects.begin(), detectedObjects.end(), this->m_trackedObjects.begin(), this->m_trackedObjects.end(), inserter(addToTrackedObjects, addToTrackedObjects.end()));
}

Problem description: I implemented operator< and operator== by which the comparision of two instances is performed by m_number, but when the sets detectedObjects and trackedObjects contain elements with the same m_number, the std::set_difference returns all elements instead of an empty result set as expected.

I even have tried to give a functional object compare to the set as template argument, but as a result I got a lot of compiler errors about = and != not being properly defined.

I wonder what is the problem?

Was it helpful?

Solution

I can't see a good reason why you're storing pointers to objects instead of the objects themselves.

To use a comparator, you need to make sure that you're providing the same comparator type to all of your set instances and to set_difference:

set<Compound_object*, compare> m_trackedObjects;

set<Compound_object*, compare> detectedObjects;
set<Compound_object*, compare> deleteFromTrackedObjects;
set_difference(detectedObjects.begin(), detectedObjects.end(),
    this->m_trackedObjects.begin(), this->m_trackedObjects.end(),
    inserter(addToTrackedObjects, addToTrackedObjects.end()),
    compare());
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top