2014/05/16

C++でiteratorを使うforループはこう書こう

std::list<int> list;
list.push_back(1);
list.push_back(2);
list.push_back(3);
list.push_back(4);

int total = 0;
for (auto itr = list.begin(), end_ = list.end(); itr != end_; itr++) {
 total += (int)*itr; 
}
どうってことないサンプルコードだけどポイントは2つ、

・autoでIteratorの型を宣言

autoで型を宣言すると正しい型を類推してくれる。
autoを使わないで書くと「std::list<int>::iterator itr」だけどこれで書くと1行には収まらない。
autoを使うだけですごく短くなるし、ぎりぎり1行に収まるので便利。

・forの初期化でend()を変数に代入

終了条件の判定で「itr != list.end()」と書いても同じだけど、ループの終了条件で関数を呼び出すのは精神衛生に良くない。
これはIBMのJavaコーディング規約にも載ってるらしい(見たことないけど)。javaの場合は
int total = 0;
for (int i = 0, l = array.length; i < l; i++) {
 total += array[i]); 
}
みたいな?

0 件のコメント:

コメントを投稿