2009-08-12 6 views
8

イテレータ条件の右辺オペランドをsize_tからintにキャストする方がよいか、または最大値の範囲を超える可能性があります。int?回答の実装は具体的ですか?size_tからintにキャストするか、size_tを使用して繰り返しますか?

int a; 
for (size_t i = 0; i < vect.size(); i++) 
{ 
    if (some_func((int)i)) 
    { 
     a = (int)i; 
    } 
} 

int a; 
for (int i = 0; i < (int)vect.size(); i++) 
{ 
    if (some_func(i)) 
    { 
     a = i; 
    } 
} 
+1

私はそれがあなたの質問がtype_tと言うところのどこでもsize_tを意味しますか?もしそうなら、それを編集してください。 –

+2

'static_cast'を使用してください。 – GManNickG

+4

'size_t'と' int'は32ビットシステムでも同じ型ではないことに注意してください。 'size_t'は' int'が署名されている間は符号なしです。これは重要な項目です。 –

答えて

7

私は時間の約80%が、私はsome_funcは、おそらくも取る必要があることを発見することがわかりますので、私はほとんど常に、最初のバリエーションを使用しますa size_t。

実際にsome_funcが符号付き整数をとる場合、vectがINT_MAXより大きくなるとどうなるかを意識する必要があります。あなたの状況で解決策が明らかでない場合(通常そうではありません)、少なくともsome_func((int)i)some_func(numeric_cast<int>(i))に置き換えることができます(numeric_castの実装についてはBoost.orgを参照)。これは、vectが負の値に静かにラップするのではなく、あなたが計画したよりも大きくなったときに例外をスローするという利点があります。

+0

本当に奇妙な振る舞いを排除するので、この場合例外がスローされるのは気に入っています...そして、おそらく決してINT_MAXを越えることはないと考えれば、それは大量の手間になります。 –

+0

@ニック:なぜあなたはインクルードを追加して別のキャスト(そして適切なもの、適切なもの、FTM - Cスタイルのキャストは決して適切ではない)を使うのは面倒ですと思いますか? – sbi

+0

関数は "あなたがしたいことをする"必要があります。 「文書化されていない限度を超えて何かをするまであなたが望むことをする」という機能は、一般に「地雷」と呼ばれるものです。あなたのコードに地雷を残しておくことは、宿題の問題以外には常に悪い考えです。 –

3

そうしない正当な理由が存在しないので、私はちょうど、size_tとしてそれを残すだろう。 "またはtype_tの最大値まで潜在的に反復する"とはどういう意味ですか? vect.size()の値までしか反復しません。

1

ほとんどのコンパイラでは、違いはありません。 32ビットシステムでは明らかですが、64ビットシステムでも、両方の変数はおそらく64ビットレジスタに格納され、64ビット値としてスタックにプッシュされます。

の値を32ビット値としてスタックに格納する場合、最初の関数はCPUサイクルの面でより効率的でなければなりません。

しかし、差はごくわずかであるが(第二の機能がきれい「に見える」)

+0

ありがとうございました。キャスティングが少ないので、2番目の外観がよりクリーンであると思っていました。合意? –

関連する問題