5
class Widget;

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

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

如何根据标准对容器进行排序,而不定义另一个标准,例如:

class CriteriumForPointers
{
public:
    bool operator()(const std::shared_ptr<Widget>& left, 
                    const std::shared_ptr<Widget>& right)const;
};
4

3 回答 3

8

您可以使用 lambda 作为适配器:

Criterium criterium;
sort(container.begin(), container.end(),
     [&criterium] (const shared_ptr<Widget> &l, const shared_ptr<Widget> &r)
     {
         return criterium(*l.get(), *r.get());
     }
);
于 2012-07-06T07:52:24.290 回答
4

使用这样的间接迭代器:

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

另见: http: //www.boost.org/doc/libs/1_49_0/libs/iterator/doc/indirect_iterator.html

于 2012-07-06T07:57:01.347 回答
1

也许您可以将 operator() 的第二个重载放入您的 Criterium 类中,如下所示:

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 ); }
}; 

(注意:我没有测试这个)

于 2012-07-06T07:49:42.127 回答