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

ラムダをアダプターとして使用できます。

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()の2番目のオーバーロードを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 に答える