Почему 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 не может быть оптимальным выбором. При создании итераторов вы обычно знаете, какой размер нужно поддерживать.

Другие вопросы по тегам