ぷろみん

プログラミング的な内容を扱ってます

C++では典型的なif文は使わない方が良い

よくある間違い

あなたはコンテナから指定のデータを探す時に以下のようなコードを書いていませんか?

for(int i = 0; i < 10; i++)
{
    if(list[i] == 5)
    {
        // do something
        break;
    }
}

正しい書き方

// #include <algorithm>が必要
auto result = std::find(list.cbegin(), list.cend(), 5);
if(result != list.cend())
{
    // do something
}

理由

一見するとC++の知識の必要のない最初のコードの方が読みやすく感じるかもしれません。
しかし、熟練のプログラマでも最初のコードを見ると一瞬これは何のコードだろうか?となります。
これは基本的な構文のみで書かれたコードにありがちな分かり辛さです。
一方、正しい書き方の方はすぐに何をしているか分かります。std::findって書いてあるのですから。

間違った書き方の方では更に悪い事にイテレータ破壊の危険性が高いです。
イテレータ破壊についての詳細は以前書いた記事を参照してください。

std::vectorの正しい使い方 - ぷろみん

しかし、algorithmを使おうとするとまずfindでは機能が足らなくなります。
find_ifになると大体の用途では問題なくなるのですが、今度はラムダを理解する必要が出てきます。
最近のコンパイラならラムダにautoを使えるので、

[](const auto& item){ return false; }

みたいに書いたら大体そのままいけるので大分楽にはなっているんで頑張ってください。スコープだけは意識して欲しいところですが。

キャプチャ内での変数宣言はもう入ったんでしたっけ。アレも出来たら便利ですね。