12/20】|TechRacho(テックラッチョ)〜エンジニアの「?」を「!」に〜|BPS株式会社エンジニアの「?」を「!」に。12/20】yoshiシェアツイートブックマークLINEはじめまして、yoshiと申します。Calenderのyoshi.kさんとは別人です。よる高速開発を行っているので、TechRachoの技術系の記事もRubyの話題が多く含まれ、すると読者層もRuby開発者が多いのかな、と思っているのですが、私はRubyは全く分かりません。現在私は弊社製品の超縦書の開発に携わっており、そこではC++を利用しています。大体C++のことしか書けない人間ですので、この記事でもC++の話をさせてもらおうかと思います。今回の記事は、そんなに深い話はしません。C++ガチ勢の方には今更な、物足りない内容だと感じるかもしれませんが、ご了承ください。この記事では、特に明示しない場合、C++14を基準にしたいと思います。そもそもイテレーターとはイテレーター、日本語では反復子とも言いますが、C++でプログラミングをしているとよく出会うことかと思います。イテレーターについてざっくり説明すると、「ある集合の要素を順番に列挙する仕組みのオブジェクト」のことです。C++に限らず、様々な言語で同じような機能は実装されていますが、C++においては、イテレーターは「ポインタと同じような動きをすることができるクラス」という設計思想になっています。すべてのイテレーターがポインタと同じ動きを実装されているとは限りません。イテレーターは、その機能によって、以下の5つのカテゴリーに分けられています。iterator)イテレーターの例イテレーターは、標準ライブラリのコンテナオブジェクトを操作する時によく使われます。std::vector<int>の中身を一個ずつ列挙してカンマ区切りで標準出力に出力したい時は、以下のような関数を作れば実行できます。}}ちなみに、ちょっと冗長に書きましたが、C++11からは範囲for文(range-based-for)という糖衣構文が用意されたので、上記のコードは下記のように書き換えることができます。}}イテレーターが消えてしまいましたね。内部的にはbegenとendが呼ばれてイテレーターを使っているので、見た目上コードが簡潔にはなりましたがイテレーターが不要になった訳ではありません。最低限のイテレーターC++の規格では、上述したように5つのイテレーターのカテゴリーが定義されていて、それぞれが満たすべき要件が挙げられています。range-based-for文で利用可能なイテレーターの要件を考えると、それよりもずっと少ない機能を満たすだけでよいということがわかります。ここでは、これを「最低限のイテレーター」と呼ぶことにします。最低限のイテレーターが満たすべき要件は以下のようになります。コピー可能である前置++演算子を利用してインクリメントを行うことができる単項*演算子で値を参照できる!=演算子で比較することができる例として、int型の整数を小さい順に列挙する最低限のイテレーターを考えてみます。}};標準ライブラリのイテレーターと互換性のあるイテレーターを用意しようと思うと、iterator_categoryやvalue_typeなどの型情報がstd::iterator_traitsを通して取得できるようにしなければなりませんが、range-based-forの中で使うだけの用途であれば、これで十分でしょう。range-based-for文では、:の右に渡された値に対して、自動的にbeginとend関数が呼ばれます。beginとendが呼ばれた時にこのmy_iterator型を返すような型とbegin/end関数を定義すればよいのです。~FizzBuzzをやってみる~イテレーターが作れるようになれば、任意のイテレーターをラップして新しいイテレーターを作れるようになります。my_iteratorをラップしてfizzbuzz_iteratorを作ってみましょう。std::endl;}こちらもオンラインコンパイラで動作させてみましたこのように、イテレーターをラップして、値を操作したり、フィルターをかけるようなこともできます。テンプレートクラスにすればもっと柔軟にできるでしょう。標準ライブラリはイテレーターを前提にした実装も多いので、自前で定義できるようになっておくと色々とできることが増えるのではないでしょうか。標準ライブラリで使うためのイテレーターは、最低限のイテレーターではなく、もう少し複雑な定義をしなければいけない場合もあります。今日のところはここまでとしたいと思います。そのうち新しい記事を書くかもしれません。Windowsの公式C++ライブラリ管理ツールシェアツイートブックマークLINEこの記事を書いた人yoshi平成元年生まれのC++er。Qiitaで誰が得するのか分からないような重箱の隅をつつく黒魔術を書いていたが、2016年8月からBPSに入社。Storageを使ってはいけない(翻訳)#Tags#会社紹介#自社サービス#勉強会#Rails#PHP#デザイン#実績#週刊RailsウオッチCONTACTお気軽にご相談ください。(翻訳)CONTACTTechRachoでは、パートナーシップをご検討いただける方からのご連絡をお待ちしております。お気軽にご意見・ご相談ください。