Python の for 文って、 C++ のに比べて格好イイですよね。
# Python for i in range( 0, n ): # 0, 1, ... , n に対して処理する
// C/C++ for( int i = 0; i < n; ++i ) { // 0, 1, ... , n に対して処理する }
単純に Python の方が短く書ける、というのも素晴らしいですが、
C++ ではループ中にループ変数 i を変更した場合に上手く動作しないのに対し、
Python ではループ変数 i がループの制御からは無関係なのが素晴らしい。
例えば
# Python for i in range( 0, n ): i = i * 2; print( i )
// C++ for( int i = 0; i < n; ++i ) { i = i * 2; std::cout << i << std::endl; }
とか書いた場合、 Python では 0 2 4 6 … と表示されるのに対し*1、
C++ では 0 2 6 14 … と表示されます*2。
どちらの動作が良いかといえば、そりゃ Python でしょう。
何とかして C++ でも Python みたいに書けないものでしょうか。
それ BOOST_FOREACH と boost::irange で出来るよ!
#include <boost/foreach.hpp> #include <boost/range/irange.hpp> #include <iostream> int main() { BOOST_FOREACH( int i, boost::irange( 0, 10 ) ) { i = i * 2; std::cout << x << std::endl; } }
BOOST_FOREACH がキモいですが、 C++0x なら範囲 for 構文を使って
#include <boost/range/irange.hpp> #include <iostream> int main() { for( int i : boost::irange( 0, 10 ) ) { i = i * 2; std::cout << x << std::endl; } }
と書けます。素晴らしい。
なお、通常は、ループ中にループ変数を書き換えることはないので、
BOOST_FOREACH( int const i, boost::irange( 0, n ) ) { // 0 から n-1 まで処理 }
と const として定義するのが望ましいです。もし偶数をループしたい場合は、
BOOST_FOREACH( int const i, boost::irange( 0, n*2, 2 ) ) { // 0, 2, ... , 2*(n-1) に対して処理 }
と書くことで差分を指定出来ます。これは丁度、 Python の
for i in range( 0, n*2, 2 ): # 0, 2, ... , 2*(n-1) に対して処理
と同じであり、 Python 同様、負の差分を使うことも出来ます。
BOOST_FOREACH( int const i, boost::irange( n, 0, -1 ) ) { // n, n-1, ... , 1 に対して処理 }
これなんで C++0x の標準ライブラリに無いの?