[cppll:0549] <tips><summary> sort by member

549
Subject:
[cppll:0549] <tips><summary> sort by member
From:
Tietew <tietew@...>
Date:
Thu, 17 Jan 2002 19:54:50 +0900
X-Mailer:
Becky! ver. 2.00.08
Message-Id:
<20020117190706.CAA6.TIETEW‐at‐tietew.net>
In-Reply-To:
464
References:
464
Tietew です。

今頃サマリ (^^;;
VC++ のコマンドラインからコンパイルすると巧くいかないです。原因
未調査。

構造体のメンバを参照する関数オブジェクトです。
たとえば,以下のようなとき:
 struct foo { int a, b; };
 vector<foo> v;
下のようなコードで foo::b を基準にソートできます:
 sort(v.begin(), v.end(), by_member2(&foo::b));
降順ソートは:
 sort(v.begin(), v.end(), by_member2(&foo::b, greater<int>()));

また,v の b メンバだけをカンマ区切りで cout に出力するとき:
 transform(v.begin(), v.end(),
     ostream_iterator<int>(std::cout, ','), by_member1(&foo::b));
と,書けるのかな?


template<class T, typename Arg, class Pr = std::less<Arg> >
class _by_member1
       : public std::unary_function<T, typename Pr::result_type>
{
       Pr pred;
       Arg T::*p;
public:
       _by_member2(Arg T::*p, Pr pred = Pr())
               : memb(memb), pred(pred) { }
       result_type operator()(const T& lhs, const T& rhs) const
               { return pred(lhs.*p, rhs.*p); }
};
template<class T, typename Arg> inline
_by_member1<T, Arg, std::less<Arg> > by_member1(Arg T::*p)
       { return _by_member1<T, Arg, std::less<Arg> >(p); }
template<class T, typename Arg, class Pr> inline
_by_member1<T, Arg, Pred> by_member1(Arg T::*p, Pr pred)
       { return _by_member1<T, Arg, Pr>(p, pred); }

template<class T, typename Arg, class Pr = std::less<Arg> >
class _by_member2
       : public std::binary_function<T, T, typename Pr::result_type>
{
       Pr pred;
       Arg T::*p;
public:
       _by_member2(Arg T::*memb, Pr pred = Pr())
               : p(p), pred(pred) { }
       result_type operator()(const T& lhs, const T& rhs) const
               { return pred(lhs.*p, rhs.*p); }
};
template<class T, typename Arg> inline
_by_member2<T, Arg, std::less<Arg> > by_member1(Arg T::*p)
       { return _by_member2<T, Arg, std::less<Arg> >(p); }
template<class T, typename Arg, class Pr> inline
_by_member2<T, Arg, Pr> by_member1(Arg T::*memb, Pr pred)
       { return _by_member2<T, Arg, Pr>(pred); }


On Wed, 09 Jan 2002 19:00:55 +0900
In article <20020109171657.391A.TIETEW@tietew.net>
[[cppll:0464] sort by member]
Tietew <tietew@...> wrote:

> 構造体のメンバを基準にしてソートしたい時,どうしてますか。


—[ Tietew ]——————————————————————————
メ : tietew@... / tietew@... / tietew@...
ホペ: http://www.tietew.net/     Tietew Windows Lab.
     http://www.masuclub.net/   鱒倶楽部
指紋: 26CB 71BB B595 09C4 0153  81C4 773C 963A D51B 8CAA

スレッド

Navigation

検索

[検索ヘルプ]

Maintener: Tietew <www.tietew.jp>
Powered by Ruby on Rails, Mongrel, PostgreSQL, and Hyper Estraier.
click here