2012-09-24 44 views
12

可能重复:
Why does the C++ standard algorithm “count” return a ptrdiff_t instead of size_t?为什么std :: count(_if)返回iterator :: difference_type而不是size_t?

有算法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); 

效果:返回在范围[第一,最后一个)的量,以下对应 条件成立我迭代的数目:* I ==值,预解码值(* 1)=假!。

difference_typeiterator'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'可以防止特殊情况使用特殊选择,而使用嵌套类型可以做出合适的选择。 –

相关问题