SlideShare a Scribd company logo
2011 関数型都市忘年会


    最近書いた
 関数型言語と関連する?
 C++プログラムの紹介
         H.Hiro (Maraigue)
    Web: http://hhiro.net/about/
         Twitter: @h_hiro_
自己紹介




H.Hiro
自己紹介



札幌C++から
 来ました
自己紹介
H.Hiro
• 大学院生(情報系)
• アルゴリズムを考案し、それを実装して
  効果を確かめたりしています(主にC++利用)
• 最近、C++11の機能をいろいろと使いたいが
  ために、研究室のマシンをUbuntuを11に
  アップしました
  (gcc4.5標準搭載のため)
自己紹介
H.Hiro
• 好んで使うもの:C++、Ruby、JavaScript
• 用途次第では使うもの:C#、Python、PHP
• 一応書けるもの:Perl、Java、etc...
自己紹介
H.Hiro
• 好んで使うもの:C++、Ruby、JavaScript
• 用途次第では使うもの:C#、Python、PHP
• 一応書けるもの:Perl、Java、etc...
• まだ使えてないもの:Scala、F#、etc...
自己紹介
•   Twitter: @h_hiro_
•   Facebook: 諸事情により非公開
•   github: maraigue(まれーぐ)
•   ブログ: LivedoorブログのID "maraigue"
•   ニコ動: 探せば見つかります
自己紹介(宣伝)

     数学勉強会@札幌
• 大学数学の内容を取り扱ってます
  (現在は「群論」をやっています)
• 毎週土曜日の10:00~12:00に
  開催
  ※今週については
   日曜10:00~12:00
• 公式サイト:ぐぐって!
自己紹介(宣伝)

   交通勉強会(trafficonf)
• 主に首都圏のメンバーがやっている
  勉強会ですが、私も乗っかってます
  (10/8 札幌でust観覧会を実施)
• 不定期開催(2~3ヶ月に1回)
• 次の開催は1/7
• 次の札幌開催は3/17?
• 公式サイト:
  「交通勉強会準備会」でぐぐって!
最近書いた
関数型言語と関連する?
C++プログラムの紹介
      H.Hiro (Maraigue)
 Web: http://hhiro.net/about/
      Twitter: @h_hiro_
おことわり

別に、直接 "関数型言語" 的な
ことをするわけではないです
おことわり

 別に、直接 "関数型言語" 的な
 ことをするわけではないです
※C++で、「直接 "関数型言語" 的なことを
  する」例:
Boost.勉強会 #6 札幌のuskz氏の発表
http://sites.google.com/site/boostjp/study_meeting/study6
最近書いた
関数型言語と関連する?
C++プログラムの紹介
      H.Hiro (Maraigue)
 Web: http://hhiro.net/about/
      Twitter: @h_hiro_
例題
与えられた文字列に対し、
「どの単語が何番目にあるか」を示す
連想配列を生成したい。
例えば
const std::string text = "I love C++";
という文字列があったとき、連想配列dataを
data["I"] == 0;
data["love"] == 1;
data["C++"] == 2;
となるようにしたい。
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos);
      if(end_pos == std::string::npos){
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      }

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
      if(end_pos == std::string::npos){
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      }

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
      if(end_pos == std::string::npos){
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      } // ↑その部分までの部分文字列をキーとし連想配列に渡す

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
      if(end_pos == std::string::npos){
        result[str.substr(begin_pos)] = number;
        break;
                                                 !!!???
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      } // ↑その部分までの部分文字列をキーとし連想配列に渡す

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();
                           関数型な方にとっては
                            普通なことなのかも
    for(;;){
      end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
      if(end_pos == std::string::npos){

                             しれないけど
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      } // ↑その部分までの部分文字列をキーとし連想配列に渡す

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();
                           文字列インスタンスを
                            別途生成するとか
    for(;;){
      end_pos = str.find(' ', begin_pos); // スペースの位置を発見して
      if(end_pos == std::string::npos){

                          (C++的には)言語道断!
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      } // ↑その部分までの部分文字列をキーとし連想配列に渡す

        begin_pos = end_pos + 1;
        number++;
    }
}
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)
(例:変数への再代入を避ける)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)

でも、メモリを重視しなければ
C++の美学に反する。(個人的な印象)
ポイント
関数型言語では、メモリや速度よりも
処理の実現方法を気にする傾向がある。
(個人的な印象)

でも、メモリを重視しなければ
C++の美学に反する。(個人的な印象)

メモリを節約しつつ、関数型言語くらいの
レベルで記法を簡略化したい
回答例(2)
Boost::splitを使う
(参考URL http://www.gesource.jp/weblog/?p=4531)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  std::list<std::string> splited;
  boost::split(splited, str, boost::is_space());

    size_t number = 1;
    BOOST_FOREACH(std::string tmp, splited){
      result[tmp] = number;
    }
}
回答例(2)
Boost::splitを使う
(参考URL http://www.gesource.jp/weblog/?p=4531)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  std::list<std::string> splited;
  boost::split(splited, str, boost::is_space());

    size_t number = 1;

                      記述は分かりやすいけど
    BOOST_FOREACH(std::string tmp, splited){
      result[tmp] = number;


                      でも文字列インスタンスを
    }
}


                       別途生成してるだろ!
つまりは
• すでに存在する文字列(constであることを
  仮定してよい)の部分文字列を
  1つの文字列として扱いたい
 ("I love C++" から "love" や "C++" を得たい)
• ただし、その「部分文字列」インスタンスを
  作る際、文字列をコピーしてはならない
• でも楽に書きたい
 (substrが使えれば楽に書けるんだけど…)
…という状況が私の手元で発生したので
ライブラリを書いたのです。
そのライブラリの名は
そのライブラリの名は




http://www.flickr.com/photos/m-louis/3391434507/
        Creative Commons 2.0 Attribution-ShareAlike
そのライブラリの名は




    fundoshi
http://www.flickr.com/photos/m-louis/3391434507/
        Creative Commons 2.0 Attribution-ShareAlike
そのライブラリの名は




    fundoshi
  (「他人のふんどしで相撲を取る」
    より)
http://www.flickr.com/photos/m-louis/3391434507/
        Creative Commons 2.0 Attribution-ShareAlike
fundoshiについて
gist.githubにあります
https://gist.github.com/1372506
(「fundoshi C++」でぐぐっても出ます)

以下のコマンドで入手可能です
git clone git://gist.github.com/1372506.git
回答例(1)
void position(const std::string & str,
              std::map<std::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos);
      if(end_pos == std::string::npos){
        result[str.substr(begin_pos)] = number;
        break;
      }else{
        result[str.substr(begin_pos, end_pos - begin_pos)] = number;
      }

        begin_pos = end_pos + 1;
        number++;
    }
}
回答例(3)
void position(const std::string & str,
              std::map<fundoshi::string, size_t> & result){
  size_t number = 0, begin_pos = 0, end_pos;
  result.clear();

    for(;;){
      end_pos = str.find(' ', begin_pos);
      if(end_pos == std::string::npos){
        result[fundoshi::string(&(str[begin_pos]))] = number;
        break;
      }else{
        result[fundoshi::string(&(str[begin_pos]),
               end_pos - begin_pos)] = number;
      }
      begin_pos = end_pos + 1;
      number++;
    }
}
実行例
int main(void){
  std::map<fundoshi::string, size_t> result;
  position("I love C++", result);

    std::cout << result["I"] << std::endl;
    std::cout << result["C++"] << std::endl;
    std::cout << result["love"] << std::endl;
}
実行例
int main(void){
  std::map<fundoshi::string, size_t> result;
  position("I love C++", result);

    std::cout << result["I"] << std::endl;
    std::cout << result["C++"] << std::endl;
    std::cout << result["love"] << std::endl;
}
↓
0
2              きたこれ!
1
簡単なリファレンス(1)
• クラス名
  – template <class CharType>
    fundoshi::basic_string<CharType>;
  – typedef basic_string<char> string;
  – typedef basic_string<wchar_t> wstring;


※std::stringとかに名前を合わせてます
 メソッド名も基本的には合わせてます
簡単なリファレンス(2)
• コンストラクタ
 – basic_string();
   // 空文字列
 – basic_string(const CharType * newstr, size_t length);
   // 文字列の一部を切り出す場合
 – basic_string(const CharType * newstr);
   // '¥0'終端の文字列を使う場合
 – basic_string(
     const std::basic_string<CharType> & newstr);
   // std::basic_string (std::stringなどを含む) を使う場合
簡単なリファレンス(3)
• ポインタを貰う
 const CharType * c_str(void) const;
• 長さを取得
 size_t length(void) const;
• 文字を取り出す
 CharType operator [](size_t pos) const;
• 文字列比較
 bool operator ==(const basic_string<CharType> & other) const;
 bool operator < (const basic_string<CharType> & other) const;
 bool operator <=(const basic_string<CharType> & other) const;
 bool operator > (const basic_string<CharType> & other) const;
 bool operator >=(const basic_string<CharType> & other) const;
おことわり


   APIは
(今のところ)これで
  全部です!
おわりに
• 私はよくRubyも使ってるのだが
  Rubyに慣れてしまうと
  C++って記法がエレガントじゃないよね
• だから記法にこだわっている
• boostとかその点頑張ってるっぽいので
  タイミングを見て勉強してみたいです
おわりに


   (再掲)
  関数型言語
あまり関係なかった。
 本当申し訳ない。
おわりに


 (もし時間が余ったら)
もう一つ「記法にこだわる」
    ネタをします
おわりに



 ありがとう
ございました

More Related Content

PDF
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
PDF
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
PDF
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
PDF
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
PDF
C++のライブラリを簡単に眺めてみよう
PDF
関数の最小値を求めることから機械学習へ
PDF
Pfi Seminar 2010 1 7
KEY
core dumpでcode golf
Boost.勉強会 #21 札幌「C++1zにstring_viewが導入されてうれしいので紹介します」
STLの型の使い分け(ダイジェスト版) @ Sapporo.cpp 第7回勉強会 (2014.10.18)
C++のSTLのコンテナ型を概観する @ Ohotech 特盛 #10(2014.8.30)
2011.7.3 札幌C++勉強会#2「C++のマクロはどこまで関数をいじれるのか」
C++のライブラリを簡単に眺めてみよう
関数の最小値を求めることから機械学習へ
Pfi Seminar 2010 1 7
core dumpでcode golf

What's hot (20)

PDF
C++コミュニティーの中心でC++をDISる
PPT
ZFSのソースコードをチラ見してみる
PDF
中3女子が狂える本当に気持ちのいい constexpr
PPTX
PDF
C++ Template Meta Programming の紹介@社内勉強会
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
PDF
Boost tour 1.60.0 merge
PDF
闇魔術を触ってみた
PDF
C++ ポインタ ブートキャンプ
PDF
リテラル文字列型までの道
PDF
Pythonデータ分析 第3回勉強会資料 8章
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか
PDF
組み込みでこそC++を使う10の理由
PDF
Gensim
PDF
brainfuckを吐く自作言語bf-reusable
PDF
ゲーム開発者のための C++11/C++14
PPT
C++でHello worldを書いてみた
PDF
Emcjp item21
PPTX
最新C++事情 C++14-C++20 (2018年10月)
PDF
Python 機械学習プログラミング データ分析ライブラリー解説編
C++コミュニティーの中心でC++をDISる
ZFSのソースコードをチラ見してみる
中3女子が狂える本当に気持ちのいい constexpr
C++ Template Meta Programming の紹介@社内勉強会
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Boost tour 1.60.0 merge
闇魔術を触ってみた
C++ ポインタ ブートキャンプ
リテラル文字列型までの道
Pythonデータ分析 第3回勉強会資料 8章
BoostAsioで可読性を求めるのは間違っているだろうか
組み込みでこそC++を使う10の理由
Gensim
brainfuckを吐く自作言語bf-reusable
ゲーム開発者のための C++11/C++14
C++でHello worldを書いてみた
Emcjp item21
最新C++事情 C++14-C++20 (2018年10月)
Python 機械学習プログラミング データ分析ライブラリー解説編
Ad

Viewers also liked (20)

PDF
Sapporocpp#2 exception-primer
PDF
C++ template-primer
PDF
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
PDF
2012.11.17 CLR/H&札幌C++勉強会 発表資料「部分文字列の取得を 効率よく!楽に! - fundoshi.hppの紹介と今後の予定 -」
PDF
最近のC++ @ Sapporo.cpp #5
PDF
Introduction to boost test
PDF
rsyncで差分バックアップしようぜ!
PDF
オーディオ用レベルメータを作ってみよう
PPTX
C++用将棋ライブラリ "OpenShogiLib"の紹介
PDF
Study3 boost
PDF
名古屋市営地下鉄最小距離完乗
PDF
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
PDF
規格書で読むC++11のスレッド
PPTX
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT
PDF
イマドキC++erのモテカワリソース管理術
PPTX
競技プログラミングのためのC++入門
PDF
C++ マルチスレッドプログラミング
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
PDF
Boost.GraphでJR全線乗り尽くしプランを立てる - プログラミング生放送+CLR/H+Sapporo.cpp 勉強会@札幌 (2014.7.12)
PDF
MSYS2使いはじめました
Sapporocpp#2 exception-primer
C++ template-primer
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法
2012.11.17 CLR/H&札幌C++勉強会 発表資料「部分文字列の取得を 効率よく!楽に! - fundoshi.hppの紹介と今後の予定 -」
最近のC++ @ Sapporo.cpp #5
Introduction to boost test
rsyncで差分バックアップしようぜ!
オーディオ用レベルメータを作ってみよう
C++用将棋ライブラリ "OpenShogiLib"の紹介
Study3 boost
名古屋市営地下鉄最小距離完乗
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」
規格書で読むC++11のスレッド
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT
イマドキC++erのモテカワリソース管理術
競技プログラミングのためのC++入門
C++ マルチスレッドプログラミング
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Boost.GraphでJR全線乗り尽くしプランを立てる - プログラミング生放送+CLR/H+Sapporo.cpp 勉強会@札幌 (2014.7.12)
MSYS2使いはじめました
Ad

Similar to 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」 (20)

PDF
プログラミング講座 #6 競プロのテクニック(初級)
PDF
Boost Tour 1.50.0 All
PDF
C++0x in programming competition
PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
PDF
中3女子でもわかる constexpr
PDF
boost tour 1.48.0 all
PDF
Boost Tour 1_58_0 merge
PDF
C++11概要 ライブラリ編
PDF
Boost tour 1_40_0
PPT
C++0x in programming competition
PDF
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
PDF
Boost.Flyweight
PDF
AtCoder Beginner Contest 011 解説
PDF
C++11のつかいかた
KEY
Algebraic DP: 動的計画法を書きやすく
PDF
Rubysapporo Stringsearch
PDF
Yarudake
PDF
SSE4.2の文字列処理命令の紹介
PPTX
Prosym2012
プログラミング講座 #6 競プロのテクニック(初級)
Boost Tour 1.50.0 All
C++0x in programming competition
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート]
中3女子でもわかる constexpr
boost tour 1.48.0 all
Boost Tour 1_58_0 merge
C++11概要 ライブラリ編
Boost tour 1_40_0
C++0x in programming competition
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】
Boost.Flyweight
AtCoder Beginner Contest 011 解説
C++11のつかいかた
Algebraic DP: 動的計画法を書きやすく
Rubysapporo Stringsearch
Yarudake
SSE4.2の文字列処理命令の紹介
Prosym2012

More from Hiro H. (18)

PDF
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
PDF
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
PDF
式を書くだけで最適化計算してほしい!~CVXPY編~
PDF
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
PDF
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
PDF
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
PDF
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
PDF
PCSじゃないよ、PCAだよ
PDF
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
PDF
スマホ音楽ゲームの動画から譜面をデータ化したかった
PDF
シンデレラガールズ声優の増え方まとめ
PDF
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
PDF
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
PDF
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
PDF
最近デレステ創作譜面作ってるので技術的な見地から話します
PDF
デレステの劇場で登場したアイドルの回数の統計取ってます
PDF
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
PDF
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024)
pandas便利だけどデフォルトパラメータでファイルを読み込むな!
式を書くだけで最適化計算してほしい!~CVXPY編~
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新)
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ)
配列の要素挿入・削除もランダムアクセスも両方高速にできる?
PCSじゃないよ、PCAだよ
声優やぞ!~シンデレラガールズにおける配役の歴史のRDFデータ化~
スマホ音楽ゲームの動画から譜面をデータ化したかった
シンデレラガールズ声優の増え方まとめ
札幌C++勉強会 #13「最近、仕事でC++11以降の新規格が役に立ったシーン紹介」
わんくま同盟 名古屋勉強会 #43 ライトニングトーク「Firefoxがver.57~(Quantum)にアップグレードされて困ったこと・やったこと」
Linuxにて複数のコマンドを並列実行(同時実行数の制限付き)
最近デレステ創作譜面作ってるので技術的な見地から話します
デレステの劇場で登場したアイドルの回数の統計取ってます
角錐や円錐が、角柱や円柱の体積の3分の1であることを積分・極限抜きで証明してみる
その文字列検索、std::string::findだけで大丈夫ですか?【Sapporo.cpp 第8回勉強会(2014.12.27)】

2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」