2012-09-24 13 views
12

可能性の重複:
Why does the C++ standard algorithm “count” return a ptrdiff_t instead of size_t?なぜstd :: count(_if)がsize_tではなくiterator :: difference_typeを返すのですか?

アルゴリズムstd::count/std::count_ifは、標準C++にあります。

template<class InputIterator, class T> 
typename iterator_traits<InputIterator>::difference_type 
count(InputIterator first, InputIterator last, const T& value); 

template<class InputIterator, class Predicate> 
typename iterator_traits<InputIterator>::difference_type 
count_if(InputIterator first, InputIterator last, Predicate pred); 

エフェクト:私範囲[まず、以下の対応 条件を保持するために)最後にイテレータの数を返します:(predは* I ==値、* I)= falseを!。

difference_typeは負であることができるiterator's difference_type、であるが、count例えば> = 0なぜdifference_typeなくsize_tだけ値を返すことができますか?

答えて

12

理論的には、要素の数が128ビットでしか表現できない巨大なシーケンスがあるかもしれません。インプリメンテーションが対応する整数型をサポートしているとすれば、size_tは64ビット型を使用する可能性が非常に高いです。しかし、この巨大なシーケンスの反復子は128ビットの整数を使用できます。個々のコンピュータのメモリにシーケンスを表す必要はないことに注意してください。複数の巨大なデータベースに分割されている可能性があります。

パフォーマンスが適度な32ビットタイプのみをサポートしている比較的小型のコンピュータもあります。完全準拠のためには、64ビットタイプをサポートしなければならないかもしれないが、プラットフォームによってネイティブにサポートされている表現を使用して、より高速な計算をむしろサポートすることが望ましい場合がある。つまり、size_tが最適な選択ではない可能性があります。イテレーターを作成するときには、サポートする必要があるサイズを一般的に知っています。

+0

ありがとう、素晴らしい説明。 – ForEveR

+1

@DietmarKuehlしかし、なぜiterator_traits :: difference_type'が良い選択ですか?ほとんどの場合、これは8バイト符号付き整数で、 'size_t'(8バイト符号なし整数)が十分に大きくないかもしれないという引数を既に破っています! –

+2

@GrimFandango:他のイテレータの選択は、私の選択に影響を与えますか?TremendousIterator :: difference_type'要は、 'std :: size_t'を使うと、特殊なケースで特別な選択肢を使うのを防ぎ、入れ子型を使うと適切な選択をすることができます。 –

関連する問題