2013-02-21 34 views
11

BOOST_FOREACHの使用に関するアドバイスをしたいと思います。BOOST_FOREACHとforループ

私はそれが実際には非常に重いヘッダーであるパフォーマンスの面でお勧めしていない読んでいる。

さらに、ブール値によって駆動される終了条件を実際には持つことができないので、「ブレイク」および「継続」ステートメントを使用する必要があります。可能であれば。

もちろん、コンテナの反復処理を容易にするイテレータを直接扱うのではないという利点があります。

あなたはどう思いますか? プロジェクトの均質性を保証するために体系的に採用するか、特定の状況下でのみ使用することをお勧めしますか?

+4

"私はいつも、"中断 "と"続行 "は可能な限り避けるべきだと言われてきました。どうぞ謝ることができますか? – utnapistim

+8

IIRC休憩を避け、人々がRAIIパターンを持たず、ループがあまりにも「不安定」になってしまうような場合には、オプティマイザが問題に陥る可能性のある良い昔には、やり直す理由がありました。それらは、関数がreturn文を1つしか持たず、ifのものといくつかのgotoのものを持っていた "single entry single exit"ドグマの時代でした。そして、その昔の教義を学び、疑問を呈したことはありませんし、何の意味もなく多くの問題を抱えている時代に、彼らを若者に広めている人がいます。 –

+0

私はあなたに同意しますが、forループを使わない、またはforループを続けることに価値があると言わなければなりません。 whileループに対してこれらのキーワードを予約し、forループで使用しないことに同意すると、意図がより明確になります。しかし、これはあまりにも多くのIMHOです、私はそれを助言しません。 – MatiasFG

答えて

18

私は、C++の範囲ベースのループがそれに取って代わると言います。これはthis BOOST_FOREACH exampleのと同等です:

std::string hello("Hello, world!"); 
for (auto c : hello) 
{ 
    std::cout << c; 
} 

私は++ 03でそれを使用するために必要な見つかっていません。

要素をコピーするために高価で、容器を超える範囲ベースのループを使用して、または一般的な文脈では、それはこれらの要素にconst&を使用するのが最適です。同様に

SomeContainerType<SomeType> v = ....; 
for (const auto& elem : v) 
{ 
    std::cout << elem << " "; 
} 

、あなたが定義さ場合コンテナの要素を変更するには、非const &(auto& elem : v)を使用します。

+0

私はあなたが[const] autoとほとんどの時間を使うべきだと思います - それ以外の場合は、コピーを取得します – Daniel

+0

詳細な説明:http://msdn.microsoft.com/en-us/library/vstudio/dd293667.aspx(参考文献とcv -qualifiers) – Daniel

+0

@Danielはい、しかし彼の場合、私たちは単一の 'char'sを持っており、私は' BOOST_FOREACH'の例と同等のものを書こうとしていました。 – juanchopanza

7

プログラミングでは、明快さは大変です。私は常にforeachをC++ 03で使用しました。手書きループよりもはるかに読みやすいと判明しました。ヘッダーサイズはあなたを殺しません。もちろん@juanchopanzaはもちろん、この問題はC++ 11では時代遅れです。

休憩や継続に関する懸念は根拠がなく、おそらく逆効果です。伝統的にC++ 03の長いfor-loopヘッダーでは、人々はではなく、ではループヘッダーを読み取り、ループヘッダーに隠れる条件変数を見落とす傾向があります。あなたの意図を明示的に中断して継続してください。

boost foreachを使用することに決めた場合は、体系的に使用してください。結局のところ、パンとバターのループを置き換えるために使用されるはずです。

0

単純なforループでBOOST_FOREACHの使用を置き換えて、50%のスピードアップを得ましたので、必ずしも常に使用するのが最善の方法ではないと言います。 実際に必要となるループカウンタ(例:「i」)も取得しません。個人的に私はあなたのスタイルに合っていればファンではなくYMMVです。

BTW - "重いヘッダー"は、プログラムのパフォーマンスに影響を与えません。コンパイル時間のみです。