Почему 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 например?

13

Решение

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

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

12

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]