Search code examples
c++decltypemultiset

Initializing multiset with custom comparison function in C++


Consider following comparison function:

bool compare(std::shared_ptr<myObject> &lhs, std::shared_ptr<myObject> &rhs){
   return lhs->value < rhs->value;
}

Now idea is to initialize a multiset of type std::shared_ptr<myObject> which orders elements with above function. So from book i read it should be done like this:

std::multiset<std::shared_ptr<myObject>, decltype(compare)*> myset{compare};

QUESTION:

My question is, in the declaration i understand a function pointer is passed to refer to compare function, but why are we initializing the set with {compare}? What is its importance and why is it necessary to do so like this??


Solution

  • Because the set needs a comparison functor to work with. If you don't specify one, it will make a default-constructed one. In this case, since you're using a function-pointer type, the default-constructed one will be a null pointer, which can't be called; so instead, you have to provide the correct function pointer at run time.

    A better approach might be to use a function class type (a.k.a. functor type); then the function call can be resolved at compile time, and a default-constructed object will do the right thing:

    struct compare {
        bool operator()(std::shared_ptr<myObject> &lhs, 
                        std::shared_ptr<myObject> &rhs) const {
            return lhs->value < rhs->value;
        }
    };
    
    std::multiset<std::shared_ptr<myObject>, compare> myset;