How to sort an object container std :: shared_ptr <Widget>?

class Widget;

std::vector< std::shared_ptr<Widget> > container

class Criterium
{
public:
    bool operator()(const Widget& left, const Widget& right)const;
};

How can I sort a container according to a criterion without defining another type criterion:

class CriteriumForPointers
{
public:
    bool operator()(const std::shared_ptr<Widget>& left, 
                    const std::shared_ptr<Widget>& right)const;
};
+5
source share
3 answers

You can use lambda as an adapter:

Criterium criterium;
sort(container.begin(), container.end(),
     [&criterium] (const shared_ptr<Widget> &l, const shared_ptr<Widget> &r)
     {
         return criterium(*l.get(), *r.get());
     }
);
+8
source

Use indirect iterators as follows:

std::sort(
  boost::make_indirect_iterator(container.begin()),
  boost::make_indirect_iterator(container.end()),
  Criterium()
);

See also: http://www.boost.org/doc/libs/1_49_0/libs/iterator/doc/indirect_iterator.html

+4
source

Perhaps you could put the second operator overload () in your Criterium class, for example:

class Criterium {
  bool operator()(const Widget& left, const Widget& right)const;
  bool operator()(const std::shared_ptr<Widget>& left,
                  const std::shared_ptr<Widget>& right)const
  { return operator()( *left, *right ); }
}; 

(note: I have not tested this)

+1
source

All Articles