【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※返信付き投稿の削除は禁止!
 ※マルチポスト(多重投稿)は慎んで!

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.22711

Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/18 08:57:30)


お世話になっておりますDD.でございます。

今回、題名の件である"ptr_fun"の扱い方がよく理解できないため
これはどういう時に扱えるものなのかご教授頂ければと思います。

同項の"mem_fun"及び"mem_fun_ref"については十分な説明と
例があり、よく理解できるのですが...

理解不足で申し訳ないですが、よろしくお願い致します。

#ptr_fun を使用すれば unary_function・binary_function を
#使わなくてもいいっていうこと?



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:Effective STL 41項 ptr_fun の扱い方 22749 DD. 2005/08/19 16:24:09


No.22749

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/19 16:24:09)


うむぅ。
皆さんあんまり使われないんですかね。。。

ちょっとHP等漁って勉強してきます。



この投稿にコメントする

削除パスワード

No.22752

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---かずま(2005/08/19 19:33:51)


> 皆さんあんまり使われないんですかね。。。

ここは、「初心者のためのポイント学習C言語」の掲示板ですからね。

ptr_fun のサンプルプログラムを挙げればいいんでしょうか?
#include <functional>  // bind1st, ptr_fun
#include <algorithm>   // find_if
#include <iostream>

bool comp(const char *a, const char *b)
{
    while (*a && *a == *b) a++, b++;
    return !*a;
}

int main()
{
   using namespace std;
   char *t[] = { "alpha", "beta", "gamma", "delta", "epsilon" };
   char **p = find_if(t, t+5, bind1st(ptr_fun(comp), "delta"));
   if (p != t+5) cout << *p << " found\n";
}

説明が欲しいというリクエストがあれば、説明します。


この投稿にコメントする

削除パスワード

No.22754

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---かずま(2005/08/19 21:56:20)


>   while (*a && *a == *b) a++, b++;
>   return !*a;

次のように訂正します。

    while (*a == *b++)
        if (!*a++) return true;
    return false;



この投稿にコメントする

削除パスワード

No.22755

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/19 23:35:05)


かずまさん回答ありがとうございます。

やはり、binary_function等を継承する関数オブジェクトを作成する
必要がないということでよろしいでしょうか?

一応かずまさんが貼り付けて下さったコードの
binary_function継承版を作成してみました。

#include <iostream>
#include <algorithm>
#include <functional>

struct comp : public std::binary_function< const char*, const char*, bool>
{
    bool operator () ( const char *a, const char *b ) const
    {
        while ( *a == *b++ ) {
            if ( !*a++ ) return true;
        }
        return false;
    }
};

int main()
{
    char *t[] = { "alpha", "beta", "gamma", "delta", "epsilon" };
    char **p = std::find_if( t, t+5, std::bind1st( comp(), "delta" ) );
    if ( p != t+5 ) {
        std::cout << "found\n";
    } else {
        std::cout << "not found\n";
    }

    return 0;
}



こうして比べて見るとコードの違いが一目瞭然ですね^^;
ptr_fun を使用すると楽になりますね。

ご指導ありがとうございました。



この投稿にコメントする

削除パスワード

No.22756

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---かずま(2005/08/20 11:34:08)


> やはり、binary_function等を継承する関数オブジェクトを作成する
> 必要がないということでよろしいでしょうか?

2つの引数を取る関数 comp が既にあって、それを利用したいとします。

find_if は、第3引数に unary_function オブジェクトが必要です。
そこで、bind1st あるいは bind2nd を使って、binary_function オブジェ
クトを unary_function オブジェクトに変換します。

comp は binary_function オブジェクトではないので、ptr_fun(comp) により
comp から binary_function オブジェクトを作成しています。

ptr_func(comp) の代わりに
ponter_to_binary_function<const char *, const char *, bool)(comp)
と書いてもかまいませんが、面倒ですよね。


> 一応かずまさんが貼り付けて下さったコードの
> binary_function継承版を作成してみました。

最初から unary_function を使えば、bind1st が要らなくなります。
#include <iostream>
#include <algorithm>
#include <functional>

class comp : public std::unary_function<const char *, bool> {
    const char *m;
public:
    comp(const char *s) : m(s) { }
    bool operator()(const char *b) const {
        for (const char *a = m; *a == *b; a++, b++)
            if (*a == '\0') return true;
        return false;
    }
};

int main()
{
    char *t[] = { "alpha", "beta", "gamma", "delta", "epsilon" };
    char **p = std::find_if(t, t+5, comp("delta"));
    std::cout << (p == t+5 ? "not found\n" : "found\n");
}



この投稿にコメントする

削除パスワード

No.22757

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/20 15:37:41)


かずまさん回答ありがとうございます。

>comp は binary_function オブジェクトではないので、ptr_fun(comp) に
>よりcomp から binary_function オブジェクトを作成しています。
なるほど。的確な説明ありがとうございます。理解致しました。

>最初から unary_function を使えば、bind1st が要らなくなります。
そうですよね^^;



この投稿にコメントする

削除パスワード

No.22782

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---かずま(2005/08/23 02:28:51)


> ptr_func(comp) の代わりに
> ponter_to_binary_function<const char *, const char *, bool)(comp)
> と書いてもかまいませんが、面倒ですよね。

ponter_to_binary_function<const char *, const char *, bool>(comp)

が本当なんですが、誰からも指摘がないということは、間違いが trivial だ
からか、それとも、C++ の STL に興味のある人が少ないのか、どちらかで
しょうね。


この投稿にコメントする

削除パスワード

No.22784

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/23 10:20:26)


>ponter_to_binary_function<const char *, const char *, bool>(comp)
>が本当なんですが、
ptr_fun<> よりも↑のほうがコードとしてはベターということなのでしょうか?

>誰からも指摘がないということは、間違いが trivial だからか、
>それとも、C++ の STL に興味のある人が少ないのか、どちらかで
>しょうね。
epistemeさんも書き込みされてますし、他掲示板で STL の
的確な回答・コードのサンプルを提供してらっしゃる方も多数??
いらっしゃるんですけどね^^;

かずまさんが最初に的確な回答・指摘をなさっていたので
以後、誰もつっこまなかっただけかも?



この投稿にコメントする

削除パスワード

No.22785

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---YuO(2005/08/23 10:58:24)


>ponter_to_binary_function<const char *, const char *, bool>(comp)
>が本当なんですが、誰からも指摘がないということは、間違いが trivial だ
>からか、それとも、C++ の STL に興味のある人が少ないのか、どちらかで
>しょうね。

「本当」とは?
ptr_funも標準C++にある関数テンプレートで,正しい方法ですが。



この投稿にコメントする

削除パスワード

No.22786

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---・・・(2005/08/23 11:21:48)


>「本当」とは?

 ) と > の違いでは?



この投稿にコメントする

削除パスワード

No.22787

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---YuO(2005/08/23 11:44:30)


>>「本当」とは?
> ) と > の違いでは?

あ,なるほど。
ミスの指摘ですか。




この投稿にコメントする

削除パスワード

No.22789

Re:Effective STL 41項 ptr_fun の扱い方
投稿者---DD.(2005/08/23 20:40:38)


> ) と > の違いでは?
あ、ほんとだ。
気づかなかった。。。

そういうことだったんですね^^;



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧