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
PDF
PDF
KEY
What's hot
PDF
PPT
PDF
中3女子が狂える本当に気持ちのいい constexpr PPTX
PDF
C++ Template Meta Programming の紹介@社内勉強会 PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏) PDF
PDF
PDF
PDF
PDF
PPTX
BoostAsioで可読性を求めるのは間違っているだろうか PDF
PDF
PDF
brainfuckを吐く自作言語bf-reusable PDF
PPT
PDF
PPTX
最新C++事情 C++14-C++20 (2018年10月) PDF
Python 機械学習プログラミング データ分析ライブラリー解説編 Viewers also liked
PDF
Sapporocpp#2 exception-primer PDF
PDF
コンピュータに「最長しりとり」「最短距離でのJR線全線乗り尽くし」を解いてもらった方法 PDF
2012.11.17 CLR/H&札幌C++勉強会 発表資料「部分文字列の取得を効率よく!楽に! - fundoshi.hppの紹介と今後の予定 -」 PDF
PDF
Introduction to boost test PDF
PDF
PPTX
C++用将棋ライブラリ"OpenShogiLib"の紹介 PDF
PDF
PDF
Boost.勉強会 #15 札幌 LT「8年間の研究生活でC++書いてて大変だったことベスト3」 PDF
PPTX
2011.6.4 TDD bootcamp 札幌2.0 自己紹介LT PDF
PPTX
PDF
PDF
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines PDF
Boost.GraphでJR全線乗り尽くしプランを立てる - プログラミング生放送+CLR/H+Sapporo.cpp 勉強会@札幌 (2014.7.12) PDF
Similar to 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
PDF
プログラミング講座 #6 競プロのテクニック(初級) PDF
PDF
C++0x in programming competition PDF
アルゴリズムのお勉強 アルゴリズムとデータ構造 [素数・文字列探索・簡単なソート] PDF
PDF
PDF
PDF
PDF
翔泳社 「C++ ゼロからはじめるプログラミング」対応 C++学習教材(三谷純) PDF
PDF
PPT
C++0x in programming competition PDF
【解説】JOI 2019/2020 一次予選 最速非公式解説【競技プログラミング】 PDF
PDF
AtCoder Beginner Contest 011 解説 PDF
KEY
Algebraic DP: 動的計画法を書きやすく PDF
PDF
PDF
More from Hiro H.
PDF
シンデレラガールズの「シンプルな」カードゲームを作りたい(アイマスハッカソン2024) PDF
pandas便利だけどデフォルトパラメータでファイルを読み込むな! PDF
式を書くだけで最適化計算してほしい!~CVXPY編~ PDF
旅行「#重複乗車禁止で名鉄完乗」とその数学的な解説 PDF
シンデレラガール総選挙の「50位圏内の難しさ」はいかほどか?(23:20更新) PDF
「MVが3人な曲の一覧」って取得できます?(デレステ・ミリシタ・エムステ) PDF
配列の要素挿入・削除もランダムアクセスも両方高速にできる? PDF
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)】 2011.12.10 関数型都市忘年会 発表資料「最近書いた、関数型言語と関連する?C++プログラムの紹介」
- 1.
2011 関数型都市忘年会
最近書いた
関数型言語と関連する?
C++プログラムの紹介
H.Hiro (Maraigue)
Web: http://hhiro.net/about/
Twitter: @h_hiro_
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
自己紹介
• Twitter: @h_hiro_
• Facebook: 諸事情により非公開
• github: maraigue(まれーぐ)
• ブログ: LivedoorブログのID "maraigue"
• ニコ動: 探せば見つかります
- 8.
自己紹介(宣伝)
数学勉強会@札幌
• 大学数学の内容を取り扱ってます
(現在は「群論」をやっています)
• 毎週土曜日の10:00~12:00に
開催
※今週については
日曜10:00~12:00
• 公式サイト:ぐぐって!
- 9.
自己紹介(宣伝)
交通勉強会(trafficonf)
• 主に首都圏のメンバーがやっている
勉強会ですが、私も乗っかってます
(10/8 札幌でust観覧会を実施)
• 不定期開催(2~3ヶ月に1回)
• 次の開催は1/7
• 次の札幌開催は3/17?
• 公式サイト:
「交通勉強会準備会」でぐぐって!
- 10.
- 11.
- 12.
おことわり
別に、直接 "関数型言語"的な
ことをするわけではないです
※C++で、「直接 "関数型言語" 的なことを
する」例:
Boost.勉強会 #6 札幌のuskz氏の発表
http://sites.google.com/site/boostjp/study_meeting/study6
- 13.
- 14.
- 15.
回答例(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++;
}
}
- 16.
回答例(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++;
}
}
- 17.
回答例(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++;
}
}
- 18.
回答例(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++;
}
}
- 19.
回答例(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++;
}
}
- 20.
回答例(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++;
}
}
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
- 27.
- 28.
つまりは
• すでに存在する文字列(constであることを
仮定してよい)の部分文字列を
1つの文字列として扱いたい
("I love C++" から "love" や "C++" を得たい)
• ただし、その「部分文字列」インスタンスを
作る際、文字列をコピーしてはならない
• でも楽に書きたい
(substrが使えれば楽に書けるんだけど…)
…という状況が私の手元で発生したので
ライブラリを書いたのです。
- 29.
- 30.
- 31.
そのライブラリの名は
fundoshi
http://www.flickr.com/photos/m-louis/3391434507/
Creative Commons 2.0 Attribution-ShareAlike
- 32.
そのライブラリの名は
fundoshi
(「他人のふんどしで相撲を取る」
より)
http://www.flickr.com/photos/m-louis/3391434507/
Creative Commons 2.0 Attribution-ShareAlike
- 33.
- 34.
回答例(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++;
}
}
- 35.
回答例(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++;
}
}
- 36.
実行例
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;
}
- 37.
実行例
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
- 38.
簡単なリファレンス(1)
• クラス名
– template <class CharType>
fundoshi::basic_string<CharType>;
– typedef basic_string<char> string;
– typedef basic_string<wchar_t> wstring;
※std::stringとかに名前を合わせてます
メソッド名も基本的には合わせてます
- 39.
簡単なリファレンス(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などを含む) を使う場合
- 40.
簡単なリファレンス(3)
• ポインタを貰う
constCharType * 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;
- 41.
おことわり
APIは
(今のところ)これで
全部です!
- 42.
- 43.
おわりに
(再掲)
関数型言語
あまり関係なかった。
本当申し訳ない。
- 44.
- 45.