'размер t 'vs' контейнер:: тип размера'


есть ли разница между size_t и container::size_type?

Я понимаю size_t более универсален и может быть использован для любого size_type s.

но container::size_type оптимизирован для конкретных типов контейнеров?

3 90

3 ответа:

стандартные контейнеры определяют size_type Как typedef, чтобы Allocator::size_type (распределитель является параметром шаблона), который для std::allocator<T>::size_type и обычно определена в size_t (или совместимый тип). Так что для стандартного случая они одинаковы.

однако при использовании пользовательского распределителя может использоваться другой базовый тип. Так что container::size_type предпочтительно для максимальной общности.

  • size_t определяется как тип, используемый для размера объекта и является зависит от платформы.
  • container::size_type - Это тип, который используется для количества элементов в контейнере и зависит от контейнера.

все std использовать контейнеры size_t Как size_type, но каждый независимый поставщик библиотеки выбирает тип, который он находит подходящим для своего контейнера.

если вы посмотрите на qt, вы найдете, что size_type контейнеров Qt зависит от версии. В Qt3 это было unsigned int и в Qt4 он был изменен на int.

на std::[w]string,std::[w]string::size_type равна std::allocator<T>::size_type, что равно std::size_t. Для других контейнеров это некоторая реализация, определенная беззнаковым целочисленным типом.

иногда полезно иметь точный тип, поэтому, например, известно, где тип обертывается (например, to UINT_MAX) так что можно воспользоваться этим. Или для шаблонов, где вам действительно нужно передать два одинаковых типа шаблонов функций/классов.

часто я нахожу, что я использую size_t для краткости или итераторы в любом случае. В общем коде, поскольку вы обычно не знаете, с каким экземпляром контейнера используется ваш шаблон и какой размер имеют эти контейнеры, вам придется использовать Container::size_type typedef если вам нужно хранить размер контейнеров.