Когда я должен использовать вектор & lt; int & gt; :: size_type вместо size_t?

В этот вопрос Я вижу следующее:

for (vector<int>::size_type ix = 0; ix ! = ivec.size(); ++ix) {
ivec[ix] = 0;
}

Я понимаю, почему int здесь не используется, но почему бы просто не использовать size_t?

При каких обстоятельствах я должен использовать vector<int>::size_type вместо size_t?

7

Решение

Основное время использования 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 вместо.


  1. И для некоторых конкретных T, vector<T>::size_type может быть и другой тип — одна из немногих вещей, которые вы можете положить в std Пространство имен — это специализация существующего класса для пользовательского типа, поэтому для некоторых T, vector<T> может использовать совершенно другой контейнер, чем для большинства других типов. Это типично для vector<bool>, но возможно и для других типов.
16

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

Одной из причин его использования является последовательность. Хотя это правда, что size_t достаточно для индексации / подсчета std::vector, это концептуально недостаточно для индексации / подсчета std::list или любой другой контейнер без массивов. Таким образом, при работе с контейнерами, вы должны обычно использовать container_type::size_type,

В общем коде, когда фактический тип контейнера неизвестен, у вас нет выбора, кроме как использовать container_type::size_type, И даже в конкретном коде, когда контейнер, как известно, является std::vectorнет необходимости делать исключение и внезапно переключаться на size_t,

5

От: вектор<ИНТ>:: size_type в C ++

«size_type является (статическим) типом члена типа vector<int>, Обычно это typedef за std::size_t, который сам обычно является typedef для unsigned int или же unsigned long long«.

1

Я думаю, что они одинаковы.

typedef typename Allocator::size_type size_type;
-1
По вопросам рекламы [email protected]