ゆき社長

シーゲンガーのお勉強 ゲームプログラマ、ゲーマー、色々!

範囲に基づくforループ (range-based) for

C++は古い言語ですが 拡張されどんどん近代化改装が行われています

C++03、C++11 ときて、もうすぐC++14がきます。

もちろん C++の後の数字は 西暦年ですね。

ってことで C++11は 2011年に決定された言語仕様ということになります

先ほどサンプル書いた中でとても便利なものが いっぱいあります

auto も便利なのですが とりあえず

範囲に基づくfor を見てみます

for (const auto& x : m) {

cout << "[" << x.first << "," << x.second << "], ";

}

さらっと書いたこの部分ですね

for文はCゲンガーなら

for(int i=0; i<10; i++)

のように覚えたと思います

for(ite it=x.begin(); it!=x.end(); it++)

STLなら上記のように書くでしょうか

あるいは std::for_each を使うかもしれませんが

それが

for (const auto& x : m)

これだけで終わります。なんと簡単なのでしょうか!

この表記を 範囲を基にしたfor (range-based for) と呼ばれてます。正式名称は知りませんが。

Java等と同じ表記なので説明は不要だとおもいますが

上記の mがコンテナで、xに iteratorが返ってきます

このfor文は、m.begin()からm.end()まで ループし、iteratorがxに入ってきます

一応 auto も説明しますが、これは コンパイル時の型推論です。

この場合xの型が mのイテレーターであることがコンパイル時にわかるので

こんな楽してOKです

で一応 std::for_eachと range-based for の比較

#include <iostream>

#include <map>

#include <algorithm>

using namespace std;

void disp( pair<const int,char>& p) {

cout << p.second << endl;

}

int main()

{

map<int,char> m;

m.insert(make_pair(1,'a'));

m.insert(make_pair(2,'b'));

m.insert(make_pair(3,'c'));

cout << "--- range-based for" << endl;

for(const auto&x: m){

cout << x.second << endl;

}

cout << "--- for_each" << endl;

for_each(m.begin(), m.end(), disp);

return(0);

}

#実行結果

--- range-based for

a

b

c

--- for_each

a

b

c

似たようなものですが、for_eachの方は 関数オブジェクト、あるいはラムダ式を使う必要があり

begin()やend() を明記する必要ありますが

range-based for の方は、完結にかけてると思います