Почему std::count(_if) возвращает итератор::diff_type вместо size_t?
Возможный дубликат:
Почему стандартный алгоритм C++ "count" возвращает ptrdiff_t вместо 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 в диапазоне [first,last), для которых выполняются следующие соответствующие условия: *i == значение, pred(*i)!= False.
difference_type
является iterator's difference_type
, который может быть отрицательным, но count
может вернуть только значение>= 0. Почему difference_type
и не size_t
например?
1 ответ
В теории у вас может быть огромная последовательность, количество элементов которой может быть представлено только 128 битами. Предполагая, что реализация поддерживает соответствующий целочисленный тип, весьма вероятно, что size_t
используйте 64-битный тип. Однако итератор для этой огромной последовательности может использовать 128-битное целое число. Обратите внимание, что последовательность не обязательно представлена в памяти любого отдельного компьютера. Он может быть разбит на несколько огромных баз данных.
У вас также может быть относительно небольшой компьютер, поддерживающий только 32-битный тип с приемлемой производительностью. Для полного соответствия стандарту может потребоваться поддержка 64-битного типа, но может быть желательно поддерживать более быстрые вычисления с использованием представления, изначально поддерживаемого платформой. То есть, size_t
не может быть оптимальным выбором. При создании итераторов вы обычно знаете, какой размер нужно поддерживать.