В этот вопрос Я вижу следующее:
for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix) {
ivec[ix] = 0;
}
Я понимаю, почему int
здесь не используется, но почему бы просто не использовать size_t
?
При каких обстоятельствах я должен использовать vector<int>::size_type
вместо size_t
?
Основное время использования size_type
находится в шаблоне. Хотя std::vector<T>::size_type
обычно size_t
, some_other_container<T>::size_type
может быть какой-то другой тип вместо1. Одна из немногих вещей, которую пользователь может добавить в std
namespace — это специализация существующего шаблона для определенного пользователем типа. Следовательно, std::vector<T>::size_type
для какой-то странности T
мог на самом деле какой-то тип, кроме size_t
хотя базовый шаблон, определенный в стандартной библиотеке, вероятно, всегда использует size_t
,
Поэтому, если вы хотите использовать правильный тип для определенного контейнера внутри шаблона, который работает с этим контейнером, вы хотите использовать container::size_type
вместо того, чтобы просто предполагать size_t
,
Обратите внимание, что общий код редко должен работать напрямую с контейнером. Вместо этого он обычно должен работать с итераторами, поэтому вместо container<T>::size_type
обычно используется что-то вроде std::iterator_traits<WhateverIterator>::difference_type
вместо.
T
, vector<T>::size_type
может быть и другой тип — одна из немногих вещей, которые вы можете положить в std
Пространство имен — это специализация существующего класса для пользовательского типа, поэтому для некоторых T
, vector<T>
может использовать совершенно другой контейнер, чем для большинства других типов. Это типично для vector<bool>
, но возможно и для других типов.Одной из причин его использования является последовательность. Хотя это правда, что size_t
достаточно для индексации / подсчета std::vector
, это концептуально недостаточно для индексации / подсчета std::list
или любой другой контейнер без массивов. Таким образом, при работе с контейнерами, вы должны обычно использовать container_type::size_type
,
В общем коде, когда фактический тип контейнера неизвестен, у вас нет выбора, кроме как использовать container_type::size_type
, И даже в конкретном коде, когда контейнер, как известно, является std::vector
нет необходимости делать исключение и внезапно переключаться на size_t
,
От: вектор<ИНТ>:: size_type в C ++
«size_type
является (статическим) типом члена типа vector<int>
, Обычно это typedef
за std::size_t
, который сам обычно является typedef для unsigned int
или же unsigned long long
«.
Я думаю, что они одинаковы.
typedef typename Allocator::size_type size_type;