読者です 読者をやめる 読者になる 読者になる

ゆとりーなの日記

日記的な事を書いて行くと思はれる

もう初心者には生のfor文も、begin()/end()も書かせたくないらしいので

アキラさん発です。これからのC++入門はfor文の記述がごっそり消えて、こんなふうに書かれるようになるのでしょうか・・・。

? 制御文

?.? pstade::oven::for_each

pstade::oven::for_eachは同じ処理を繰り返し行う時に使用することで効率よくプログラムを記述することができます。
例として、繰り返しを3回行う「oven::for_each」文を作ってみましょう。ループカウンタとしてboost::irange(0, 3)、繰り返す処理をラムダ式で与えます。

#include <iostream>
#include <boost/range/irange.hpp>
#include <pstade/oven/algorithm.hpp>

int main() {
  pstade::oven::for_each(boost::irange(0, 3), [](int) {
    std::cout << "hello world" << std::endl;
  });
}

ループカウンタをpstade::oven::for_each内部で次のように参照することができます。

#include <iostream>
#include <boost/range/irange.hpp>
#include <pstade/oven/algorithm.hpp>

int main() {
  pstade::oven::for_each(boost::irange(1, 4), [](const int i) {
    std::cout << "hello world" << std::endl;
    std::cout << i << "回目の繰り返し" << std::endl;
  });
}

配列の中身を全て表示したいような場合は、ループカウンタの代わりに表示したい配列を渡します。ラムダ式の引数には、配列の中身が毎回入っているので、それを表示するように書いてやります。

#include <iostream>
#include <array>
#include <boost/range/irange.hpp>
#include <pstade/oven/algorithm.hpp>

int main() {
  const std::array<int, 3> v = {3, 1, 4};
  pstade::oven::for_each(v, [](const int x) {
    std::cout << x << std::endl;
  });
}

配列の中身を表示するとき、添え字も一緒に表示したい時が結構あると思います。この時ループカウンタと配列を両方扱うには次のようにします。

#include <iostream>
#include <array>
#include <boost/tuple/tuple.hpp>
#include <boost/range/irange.hpp>
#include <pstade/oven/algorithm.hpp>
#include <pstade/oven/zipped.hpp>

int main() {
  const std::array<int, 3> v = {3, 1, 4};
  pstade::oven::for_each(boost::make_tuple(v, boost::irange(0U, v.size())) | pstade::oven::zipped, 
                         [](const boost::tuples::tuple<int, int> t) {
    int x, i;
    boost::tie(x, i) = t;
    std::cout << "v[" << i << "] = " << x << std::endl;
  });
}