SlideShare a Scribd company logo
Enviar búsqueda
Cargar
Iniciar sesión
Registrarse
Replace Output Iterator and Extend Range JP
Denunciar
Akira Takahashi
Seguir
Programmer en Preferred Networks, Inc.
26 de May de 2012
•
0 recomendaciones
•
1,605 vistas
1
de
26
Replace Output Iterator and Extend Range JP
26 de May de 2012
•
0 recomendaciones
•
1,605 vistas
Descargar ahora
Descargar para leer sin conexión
Denunciar
Akira Takahashi
Seguir
Programmer en Preferred Networks, Inc.
Recomendados
What is template
Akira Takahashi
2.9K vistas
•
32 diapositivas
error handling using expected
Akira Takahashi
3K vistas
•
30 diapositivas
競技プログラミングのためのC++入門
natrium11321
32.9K vistas
•
63 diapositivas
C++ ポインタ ブートキャンプ
Kohsuke Yuasa
10.9K vistas
•
145 diapositivas
templateとautoの型推論
MITSUNARI Shigeo
15K vistas
•
22 diapositivas
Effective Modern C++ 勉強会#1 Item3,4
Takashi Hoshino
2.7K vistas
•
24 diapositivas
Más contenido relacionado
La actualidad más candente
Emcpp item31
mitsutaka_takeda
10.4K vistas
•
25 diapositivas
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
18.1K vistas
•
29 diapositivas
C++入門?
tsudaa
3.6K vistas
•
32 diapositivas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
13.1K vistas
•
133 diapositivas
メタプログラミング C#
Fujio Kojima
8.1K vistas
•
50 diapositivas
C++0x 言語の未来を語る
Akira Takahashi
1.7K vistas
•
40 diapositivas
La actualidad más candente
(20)
Emcpp item31
mitsutaka_takeda
•
10.4K vistas
競技プログラミングにおけるコードの書き方とその利便性
Hibiki Yamashiro
•
18.1K vistas
C++入門?
tsudaa
•
3.6K vistas
Boost.勉強会#19東京 Effective Modern C++とC++ Core Guidelines
Shintarou Okada
•
13.1K vistas
メタプログラミング C#
Fujio Kojima
•
8.1K vistas
C++0x 言語の未来を語る
Akira Takahashi
•
1.7K vistas
わんくま同盟大阪勉強会#61
TATSUYA HAYAMIZU
•
955 vistas
C# 8.0 null許容参照型
信之 岩永
•
2.8K vistas
Effective modern C++ 勉強会 #3 Item 12
Keisuke Fukuda
•
2.4K vistas
C++ Template Metaprogramming
Akira Takahashi
•
5.1K vistas
C#6.0の新機能紹介
Kazunori Hamamoto
•
3.4K vistas
Map
kikairoya
•
10.1K vistas
知って得するC#
Shota Baba
•
9.7K vistas
Emcpp0506
Takatoshi Kondo
•
10.6K vistas
C++ Template Meta Programming の紹介@社内勉強会
Akihiko Matuura
•
9.4K vistas
オブジェクト指向入門7
Kenta Hattori
•
242 vistas
C# 9.0 / .NET 5.0
信之 岩永
•
2.6K vistas
Visual C++で使えるC++11
nekko1119
•
36.8K vistas
Template Meta Programming入門から応用まで
yoshihikoozaki5
•
12.2K vistas
ゲーム開発者のための C++11/C++14
Ryo Suzuki
•
102.7K vistas
Destacado
四校交流_菩提居服務隊簡報
Chun-Chuan Lin
1.1K vistas
•
26 diapositivas
Олександр Кубраков
Kyiv_urban_transport_conference
559 vistas
•
9 diapositivas
Getting Students Excited About Reading with the iPad
Shelly Sanchez Terrell
6.3K vistas
•
48 diapositivas
Presentation 4
Javed Hathisingwala
296 vistas
•
27 diapositivas
AIR CAR
VMS Group
392 vistas
•
21 diapositivas
Collaborative Sites for Learners
Shelly Sanchez Terrell
1.3K vistas
•
38 diapositivas
Destacado
(13)
四校交流_菩提居服務隊簡報
Chun-Chuan Lin
•
1.1K vistas
Олександр Кубраков
Kyiv_urban_transport_conference
•
559 vistas
Getting Students Excited About Reading with the iPad
Shelly Sanchez Terrell
•
6.3K vistas
Presentation 4
Javed Hathisingwala
•
296 vistas
AIR CAR
VMS Group
•
392 vistas
Collaborative Sites for Learners
Shelly Sanchez Terrell
•
1.3K vistas
Hosting Public Domain Chemicals Data Online for the Community – the Challenge...
US Environmental Protection Agency (EPA), Center for Computational Toxicology and Exposure
•
1.4K vistas
Dara Nasr, Drive campaigns further and faster with Twitter, Impact thro…
JustGiving
•
1.9K vistas
Netmera beacon management
Netmera
•
1.2K vistas
Богдан Аганін
Kyiv_urban_transport_conference
•
1.1K vistas
Presentation final
Eoin Molloy
•
242 vistas
UAE to abolish fuel subsidies - other oil producers to follow suit
Aranca
•
451 vistas
Engage 2013 - Optimizing Mobile + Social Channels
Webtrends
•
1.7K vistas
Similar a Replace Output Iterator and Extend Range JP
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima
778 vistas
•
67 diapositivas
Boost Fusion Library
Akira Takahashi
2.7K vistas
•
38 diapositivas
JavaScript入門
Ryo Maruyama
1.1K vistas
•
31 diapositivas
研究生のためのC++ no.2
Tomohiro Namba
427 vistas
•
45 diapositivas
Project lambda
Appresso Engineering Team
760 vistas
•
50 diapositivas
Improvement future api
Akira Takahashi
7.9K vistas
•
29 diapositivas
Similar a Replace Output Iterator and Extend Range JP
(20)
C#の新機能勉強会 ~ C#7、8の新機能を活用して速く安全なプログラムを書こう~
Fujio Kojima
•
778 vistas
Boost Fusion Library
Akira Takahashi
•
2.7K vistas
JavaScript入門
Ryo Maruyama
•
1.1K vistas
研究生のためのC++ no.2
Tomohiro Namba
•
427 vistas
Project lambda
Appresso Engineering Team
•
760 vistas
Improvement future api
Akira Takahashi
•
7.9K vistas
C++コンパイラ GCCとClangからのメッセージをお読みください
digitalghost
•
4.7K vistas
エキ Py 読書会02 2章後半
Tetsuya Morimoto
•
649 vistas
エキ Py 読書会02 2010/9/7
Tetsuya Morimoto
•
1.2K vistas
はじめてのPython
Katsumi Honda
•
4.4K vistas
T69 c++cli ネイティブライブラリラッピング入門
伸男 伊藤
•
5.2K vistas
More C++11
京大 マイコンクラブ
•
13.9K vistas
Swift 2.0 大域関数の行方から #swift2symposium
Tomohiro Kumagai
•
12.7K vistas
Fork/Join Framework。そしてLambdaへ。
Yuichi Sakuraba
•
1.9K vistas
Tokyor14 - R言語でユニットテスト
Yohei Sato
•
6.6K vistas
Boost Tour 1.50.0
Akira Takahashi
•
1.1K vistas
たのしい関数型
Shinichi Kozake
•
6.2K vistas
Node.jsでつくるNode.js ミニインタープリター&コンパイラー
mganeko
•
1.3K vistas
C++0x in programming competition
yak1ex
•
1.8K vistas
ひのきのぼうだけで全クリ目指す
AromaBlack
•
1.5K vistas
Más de Akira Takahashi
Cpp20 overview language features
Akira Takahashi
890 vistas
•
28 diapositivas
Cppmix 02
Akira Takahashi
674 vistas
•
7 diapositivas
Cppmix 01
Akira Takahashi
999 vistas
•
11 diapositivas
Modern C++ Learning
Akira Takahashi
18.5K vistas
•
12 diapositivas
cpprefjp documentation
Akira Takahashi
1.3K vistas
•
23 diapositivas
C++1z draft
Akira Takahashi
6.6K vistas
•
67 diapositivas
Más de Akira Takahashi
(20)
Cpp20 overview language features
Akira Takahashi
•
890 vistas
Cppmix 02
Akira Takahashi
•
674 vistas
Cppmix 01
Akira Takahashi
•
999 vistas
Modern C++ Learning
Akira Takahashi
•
18.5K vistas
cpprefjp documentation
Akira Takahashi
•
1.3K vistas
C++1z draft
Akira Takahashi
•
6.6K vistas
Boost tour 1_61_0 merge
Akira Takahashi
•
2K vistas
Boost tour 1_61_0
Akira Takahashi
•
1.4K vistas
Boost tour 1.60.0 merge
Akira Takahashi
•
5.1K vistas
Boost tour 1.60.0
Akira Takahashi
•
2.1K vistas
Boost container feature
Akira Takahashi
•
3.4K vistas
Boost Tour 1_58_0 merge
Akira Takahashi
•
4.8K vistas
Boost Tour 1_58_0
Akira Takahashi
•
2.5K vistas
C++14 solve explicit_default_constructor
Akira Takahashi
•
7.3K vistas
C++14 enum hash
Akira Takahashi
•
8.1K vistas
Multi paradigm design
Akira Takahashi
•
3.2K vistas
Start Concurrent
Akira Takahashi
•
22.8K vistas
Programmer mind
Akira Takahashi
•
10K vistas
Boost.Study 14 Opening
Akira Takahashi
•
4.1K vistas
Executors and schedulers
Akira Takahashi
•
7.4K vistas
Replace Output Iterator and Extend Range JP
1.
Output Iteratorの置き換えと
Boost.Rangeの拡張 高橋 晶(Akira Takahashi) 株式会社ロングゲート @cpp_akira 2012/05/26(土) Boost.勉強会 #9 つくば
2.
この発表について C++Now! 2012のLibrary in
a Weekで 発表した内容の日本語版です。
3.
Library in a
Week • 一週間のC++Now!の中で、みんなでライブラリを書こう! というプロジェクト • 2012年のテーマは「C++11時代のアルゴリズム」 – Boost.RangeやBoost.Algorithm、ASL (Adobe Source Library)の拡張が 盛んに行われた • Library in a Weekは5日間、毎朝08:00から09:00まで行われる。 – 毎朝1時間みんなで集まって作業するのではなく、セッションの合間に ある休み時間等で作業する – C++Now!は毎日08:00から22:00まで。 – 時間ないです。 • そんなプロジェクトで、私が構想しているアイデアと、現在進 めているプロジェクトの発表をしてきました。
4.
1st Output Iterators Must
Go
5.
このアイデアの概要 • C++11となった今となっては、Output Iteratorは必要ない。 •
なぜなら、C++11にはラムダ式があるから。 • いくつかのSTLアルゴリズムは、Output Iteratorを UnaryFunctionに置き換えることができる。
6.
基本的な例: std::copy std::copyはstd::for_each +
ラムダで置き換えることができる。 Before: std::vector<int> v = {1, 2, 3}; std::vector<int> result; std::copy(v.begin(), v.end(), std::back_inserter(result)); After: std::vector<int> v = {1, 2, 3}; std::vector<int> result; std::for_each(v.begin(), v.end(), [&](int x) { result.push_back(x); }); この置き換えはそこそこ便利
7.
より実用的な例:集合演算 集合演算のアルゴリズムは、Output Iteratorバージョンしか 用意されていないため、カスタム操作がとても書きにくい。 現在の集合演算アルゴリズム std::set<int>
a = {1, 2, 3}; std::set<int> b = {4, 5, 6}; std::set<int> result; std::set_union(a.begin(), a.end(), b.begin(), b.end(), std::inserter(result, result.end())); Insert Iteratorアダプタは全然便利じゃない。
8.
より実用的な例:集合演算 集合演算のアルゴリズムは、Output Iteratorバージョンしか 用意されていないため、カスタム操作がとても書きにくい。 新たなの集合演算アルゴリズムの提案 std::set<int>
a = {1, 2, 3}; std::set<int> b = {4, 5, 6}; std::set<int> result; set_union(a.begin(), a.end(), b.begin(), b.end(), [](int x) { result.insert(x); }); Output IteratorをUnaryFunctionに置き換えた。 これは実際とても便利で、カスタム操作も簡単に書ける。
9.
実装の話 1/4
• 基本的な実装はとても簡単。 • 関数呼び出しを行うOutput Iteratorを書いてラップすればい い。そのようなOutput Iteratorはすでに boost::function_output_iteratorとして用意されている。 template <class InputIterator1, class InputIterator2, class UnaryFunction> void set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, UnaryFunction&& f) { std::set_union( first1, last1, first2, last2, boost::make_function_output_iterator(boost::move(f))); }
10.
実装の話 2/4
• function_output_iteratorの中身 template <class UnaryFunction> struct function_output_iterator { explicit function_output_iterator(const UnaryFunction& f) : m_f(f) {} struct output_proxy { output_proxy(UnaryFunction& f) : m_f(f) { } template <class T> output_proxy& operator=(const T& value) { m_f(value); return *this; } UnaryFunction& m_f; }; output_proxy operator*() { return output_proxy(m_f); } function_output_iterator& operator++() { return *this; } function_output_iterator& operator++(int) { return *this; } UnaryFunction m_f; };
11.
実装の話 3/4
• std名前空間に同じ名前のset_union()関数を共存させる方法 • 型TがUnaryFunctionかどうかを判定するis_unary_callableメ タ関数を作ってSFINAEする。 template <class InputIterator1, class InputIterator2, class UnaryFunction> auto set_union(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, InputIterator2 last2, UnaryFunction&& f) -> typename boost::enable_if<is_unary_callable< UnaryFunction, decltype(*first1) >>::type { std::set_union( first1, last1, first2, last2, boost::make_function_output_iterator(boost::move(f))); } これで、テンプレートパラメータUnaryFunctionが単項関数呼び出し可能でなければ、 この関数はオーバーロード解決から除外される。
12.
実装の話 4/4
• is_unary_callableは、C++11のdecltype + SFINAEで、関数呼び 出しの式が正当かどうかをチェックし、正当であれば true_type、不正であればfalse_typeを返すようにしてる。 template <class F, class V> struct is_unary_callable_base { private: template <class F2, class V2> static auto check(F2&& f, V2 v) -> decltype((f(v)), std::true_type()); static auto check(...) -> std::false_type; public: typedef decltype(check(std::declval<F>(), std::declval<V>())) type; }; template <class F, class V> struct is_unary_callable : is_unary_callable_base<F, V>::type {};
13.
Output Iteratorの置き換えまとめ • Output
Iteratorは、ラムダ式のあるC++11時代では UnaryFunctionでの置き換えが十分に便利。 • この実装はそのうちドキュメントとテストを書いて Boost.Algorithmに提案する予定。 (Library in a Weekの成果はその年のうちに反映させる、とい う方針のため) • 実装はこちら: https://github.com/faithandbrave/Set-Algorithm
14.
2nd OvenToBoost プロジェクト
15.
OvenToBoostプロジェクトとは • OvenというのはP-Stade C++
Librariesに含まれるRangeライブ ラリ • OvenはBoost.Rangeよりもいろいろと揃ってて便利 • 現在、OvenをBoost.Rangeの拡張として移植するプロジェクト を進めています。 https://github.com/faithandbrave/OvenToBoost
16.
Boost.Range概要
• イテレータの組をとるSTLアルゴリズムのラッパー、Rangeアル ゴリズムが提供されている • それに加えて、遅延評価のリスト操作のためのRangeアダプ タと呼ばれる機能が提供されている。 const std::vector<int> v = {3, 1, 4, 2, 5}; boost::for_each(v | filtered(is_even), print); // 偶数値を出力 4 2 • Rangeアダプタの適用にはoperator|()を使用する。これはUNIXの パイプにあやかっている。 • Rangeアダプタの名前は過去分詞を使用している。 • このサンプルにおいてfor_each + filteredは1ループで処理される
17.
Boost.Rangeの問題点 • Rangeアダプタが少なすぎる –
takenがない – droppedもない – 無限Rangeがない – 足りなすぎる・・・。 • Boost.RangeのRangeアダプタはラムダを扱えない • Ovenはこれらの問題に対する解決策を持っている
18.
taken Rangeアダプタ takenはRangeから先頭N個の要素を取り出したRangeを生成する const std::vector<int>
v = {3, 1, 4, 2, 5}; boost::for_each(v | taken(2), print); 3 1
19.
dropped Rangeアダプタ droppedはRangeから先頭N個の要素を除いたRangeを生成する const std::vector<int>
v = {3, 1, 4, 2, 5}; boost::for_each(v | dropped(2), print); 4 2 5
20.
elements Rangeアダプタ elementsはRangeのオブジェクトから特定要素のみを抽出する struct Person
{ int id; std::string name; … }; BOOST_FUSION_ADAPT_STRUCT(…) const std::vector<Person> v = { {1, "Alice"} {2, "Carol"} {3, "Bob"} }; boost::for_each(v | elements<1>(), print); Alice,Carol,Bob
21.
elements_key Rangeアダプタ elements_keyはタグを使用してRangeのオブジェクトから特定要素のみを抽出する struct id_tag
{}; struct name_tag {}; struct Person { int id; std::string name; … }; BOOST_FUSION_ADAPT_ASSOC_STRUCT(…) const std::vector<Person> v = { {1, "Alice"} {2, "Carol"} {3, "Bob"} }; boost::for_each(v | elements_key<name_tag>(), print); Alice,Carol,Bob
22.
iteration関数 iteration()は無限Rangeを生成する関数。第2引数は次の値を計算する関数。 int next(int x)
{ return x * 2; } boost::for_each(iteration(1, next) | taken(5), print); 1 2 4 8 16
23.
regular関数 regular()関数は関数オブジェクトをRegular Concept(DefaultConstructible & CopyAssinable)を満たすように変換する。ラムダはRegular
Conceptを満たさない ので、イテレータに入れるとInput Iteratorになれない template <class InputIterator, class F> F for_each_(InputIterator first, InputIterator last, F f) { InputIterator it; // default construct it = first; // copy assign while (it != last) { f(*it); ++i; } return f; } template <class Range, class F> F for_each_(const Range& r, F f) { return for_each(boost::begin(r), boost::end(r), f); } using boost::lambda::_1; for_each_(r | filtered(_1 % 2 == 0), f); // Error! for_each_(r | filtered(regular(_1 % 2 == 0)), f); // OK
24.
regular演算子operator|+() regular()関数のシンタックスシュガー。 operator|()と同じ優先順と結合規則を持つ演算子が存在しなかったので、 operator|()と単項のoperator+()を組み合わせた複合演算子を作った。 template <class InputIterator,
class F> F for_each_(InputIterator first, InputIterator last, F f) { InputIterator it; // default construct it = first; // copy assign while (it != last) { f(*it); ++i; } return f; } template <class Range, class F> F for_each_(const Range& r, F f) { return for_each(boost::begin(r), boost::end(r), f); } using boost::lambda::_1; for_each_(r | filtered(_1 % 2 == 0), f); // Error! for_each_(r |+ filtered(_1 % 2 == 0), f); // OK
25.
Ovenの機能を組み合わせた例:素数列 エラトステネスのふるいを使った素数の無限数列。 range sieve(range r) {
return r | dropped(1) |+ filtered(_1 % value_front(r) != 0); } range primes = iteration(range( iteration(2, regular(_1 + 1))), sieve) | transformed(value_front); for_each(primes, print); 2 3 5 7 11 …
26.
OvenToBoostの現状 • 最優先の機能は実装完了。 • テストも完了。 •
ドキュメントが終わっていなかったが、Library in a Weekでほ ぼ完了。 – 現在、zakさんに英語を綺麗にしてもらって、hotwatermorningさんにド キュメントのビルドを手伝ってもらってる • ドキュメント整備がまもなく完了するので、近々Boostのレ ビューリクエストを提出する予定。