Почему std:: count (_if) возвращает итератор:: differ_type вместо size_t?

Возможный дубликат:
Почему стандартный алгоритм С++ "count" возвращает ptrdiff_t вместо size_t?

В стандартном С++ существует алгоритм 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);

Эффекты: возвращает число итераторов я в диапазоне [первый, последний], для которого следующие соответствующие условия сохраняются: * я == value, pred (* i)!= false.

difference_type - iterator difference_type, который может быть отрицательным, но count может возвращать только значение >= 0. Почему difference_type, а не size_t например?

Ответ 1

В теории вы можете иметь потрясающую последовательность, число элементов которой может быть представлено только 128 бит. Предполагая, что реализация поддерживает соответствующий целочисленный тип, вполне вероятно, что size_t использует 64-битный тип. Тем не менее, итератор для этой огромной последовательности может использовать 128-битное целое число. Обратите внимание, что последовательность не нужна в памяти любого отдельного компьютера. Он может быть разделен на несколько огромных баз данных.

У вас может также быть относительно небольшой компьютер, поддерживающий только 32-разрядный тип с разумной производительностью. Для полного стандартного соответствия он может поддерживать 64-битный тип, но может быть желательно скорее поддерживать более быстрые вычисления с использованием представления, поддерживаемого платформой. То есть size_t может не быть оптимальным выбором. При создании итераторов вы обычно знаете, какой размер необходимо поддерживать.