2013-02-11 4 views
5

Я был очень удивлен, увидев, что std::count вернулся iterator_traits<InputIterator>::difference_type, что по очереди относится к long int на моей платформе.Почему std :: count возвращает целое число со знаком?

Почему? Отрицательные элементы счета в контейнере не имеют никакого смысла.

+1

Разница будет отрицательной, если диапазон недействителен, и это дает неопределенное поведение во время алгоритма. –

+0

Это обсуждение может быть полезно: http://stackoverflow.com/questions/7505083/why-does-the-c-standard-algorithm-count-return-a-ptrdiff-t-instead-of-size-t?answertab = active # tab-top – Jordan

+0

@ChristianIvicevic, я смущен. Это неопределенное поведение или нет? Я имею в виду, что либо границы итераторов проверяются, и они возвращают отрицательное значение при ошибке, либо это неопределенное поведение, а затем возвращаемое значение не определено. – qdii

ответ

5

Это фактически std::ptrdiff_t, который должен быть целым числом со знаком. Он должен быть подписан, потому что он может использоваться как разница между двумя итераторами, и это, конечно, может быть отрицательным.

+0

+1. Черт, я должен был создать ответ, а не комментарий ... но да, это так. –

+2

Итак, следующий вопрос: зачем они используют 'std :: ptrdiff_t' для std :: count, и на него отвечает другой пост. так что спасибо. – qdii

+1

@qdii 'std :: iterator_traits :: difference_type' - это то же, что и итераторы' differ_type', который по умолчанию имеет значение 'ptrdiff_t' (как показано, например [здесь] (http://en.cppreference.com/w/cpp/ iterator/iterator). Почему расстояние указано как 'ptrdiff_t' _probably_, потому что итераторы могут использоваться так же, как указатели, но спецификация (C++ 11) на самом деле не дает причины, почему она просто указывает, что она –

Смежные вопросы