[cppll:0549] <tips><summary> sort by member
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
今頃サマリ (^^;;
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
▼ スレッド
- 464: 構造体のメンバを基準にしてソートしたい時,どうしてますか。 struct foo { int a; int b; }; vector<foo> Tietew
- ├470: std::binary_function -[ Tietew ]-------------------------- メ : tietew‐at‐tietew.net / tietew‐at‐raug.net / tietew‐at‐masuclub.net ホ Tietew
- ├473: なんか ... by_member2(Arg T::*p, Pr pred = std::less<Arg>()) error C2514: 'std::less<`template-parameter258'>' :クラスに Wraith the Trickster
- ├477: 本年もよろしくです〜。>ALL 私のところのVC++6.0と、ちょっとエラーメッセージが違いますね。 T.Sawamoto
- │└478: あらじん: C++魔人よ、superキーワードを追加せよ! じぃにぃ: ご主人様、多重継承したときゃどい FUKUDA Fumiki
- │ ├480: 市川@vivi-vine.org です 冗談ですが、継承の記述の一番左の class とか (^^) 親クラス群を vector や lis Shin'ichi Ichikawa
- │ │├481: メタなクラスを扱うライブラリとか作って実現させるのも面白いかも。 □■□■ Wraith the Trickst Wraith the Trickster
- │ ││└483: 市川@vivi-vine.org です なるほどね。従来の固定的なクラスも使えるのも利点といえば利点だし。 Shin'ichi Ichikawa
- │ │└482: 魔人、冷静ですね。 コンパイル時に操作できる型リストが、Modern C++ Designに、あります。 テン Shin'ya MORINO
- │ │ └484: 、と思ったら、的はずしてますね。 なんや、かんちがいしてる。すんません。 森野慎也 mailto:s Shin'ya MORINO
- │ └6166: それでは、お言葉に甘えて。 ** 例えば、class C : public A, public B { ... }; とあって、 C::foo() の中に Hoshi Takanori
- │ └6167: ref# 添えてってばぁ... いまさらどのツラ下げて...てかー たしかに、super::foo()に相当するものが FUKUDA Fumiki
- └549: 今頃サマリ (^^;; VC++ のコマンドラインからコンパイルすると巧くいかないです。原因 未調査。 Tietew