Why is the return type of std::count
the difference_type
of the iterators (often a ptrdiff_t
).
Since count can never be negative, isn't size_t
technically the right choice? And what if the count exceeds the range of ptrdiff_t
since the theoretical possible size of an array can be size_t
?
EDIT: So far there is no suitable answer as to why the function returns ptrdiff_t
. Some explanation gathered from the answers below is that the return type is iterator_traits<InputIterator>::difference_type
which is generic and can be anything. Up until that point it makes sense. There are cases where the count may exceed size_t
. However, it still does not make sense why the return type is typedef ptrdiff_t iterator_traits<InputIterator>::difference_type
for the standard iterators instead of typedef size_t iterator_traits<InputIterator>::difference_type
.
The std::count()
algorithm relies on the iterator type to define an integral type large enough to represent any size of a range. Possible implementation of containers include files and network streams, etc. There is no guarantee that the entire range fits into the process' address space at once, so std::size_t
might be too small.
The only integral type offered by the standard std::iterator_traits<>
is std::iterator_traits<>::difference_type
, which is suitable for representing "distances" between two iterators. For iterators implemented as (wrappers of) pointers, this type is std::ptrdiff_t
. There is no size_type
or the like from iterator traits, so there is no other choice.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With