範囲に基づく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 の方は、完結にかけてると思います