为什么std :: count(_if)返回iterator :: difference_type而不是size_t?

For*_*veR 14 c++ library-design stl-algorithm c++11

可能重复:
为什么C++标准算法"count"会返回ptrdiff_t而不是size_t?

标准C++中有算法std::count/ std::count_if.

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);
Run Code Online (Sandbox Code Playgroud)

效果:返回以下相应条件所适用的[first,last]范围内的迭代器数量:*i == value,pred(*i)!= false.

difference_type是iterator's difference_type,可以是负数,但count只能返回值> = 0.为什么difference_type而不是size_t例如?

Die*_*ühl 12

理论上,您可能有一个巨大的序列,其元素数量只能用128位表示.假设实现支持相应的整数类型,很可能size_t使用64位类型.但是,这个巨大序列的迭代器可以使用128位整数.注意,序列不必在任何单个计算机的存储器中表示.它可能分散在多个庞大的数据库中.

您可能还有一台相对较小的计算机,仅支持具有合理性能的32位类型.对于完全标准的一致性,它可能必须支持64位类型,但是可能希望使用平台本机支持的表示来支持更快的计算.也就是说,size_t可能不是最佳选择.在创建迭代器时,您通常知道需要支持的大小.

  • @GrimFandango:对其他迭代器的选择如何影响我对`TremendousIterator :: difference_type`的选择?关键是使用`std :: size_t`可以防止特殊情况使用特殊选择,而使用嵌套类型可以做出合适的选择. (2认同)