vector<int>::size_type
- это тип, который гарантированно будет содержать размер самого большого vector
, который у вас может быть, и, таким образом, он гарантированно позволит вам индексировать все элементы vector
(поскольку индексы изменяются от 0 до размера-1);это тип, используемый для индексов и размеров во всех методах vector
.
Если у вас очень большие массивы, это может быть актуально, поскольку другие целочисленные типы могут переполняться (и если они являются типами signed
)все может стать довольно странным);даже если вам никогда не удастся получить настолько большие массивы, чтобы это могло иметь значение, это принципиально важно для чистоты кода;кроме того, ваш ix
имеет тот же тип ivec.size()
, поэтому вы не получаете предупреждений о сравнении целых чисел со знаком и без знака.
Фон : vector<T>::size_type
обычно typedef
для size_t
(я где-то читал, что на самом деле стандарт неявно налагает его на size_t
- РЕДАКТИРОВАТЬ : это вообще не подразумевается, см. @ Nawaz *Ответ 1023 *), который, в свою очередь, является типом возврата оператора sizeof
.Это неявно говорит о том, что он может содержать размер самого большого объекта, используемого в приложении C ++, поэтому он, безусловно, (достаточно) достаточно большой, чтобы индексировать массивы любого типа.
На самом деле, я использую size_t
(определенов <cstddef>
) в качестве индекса и для массивов в стиле С, и я думаю, что это хорошая практика по тем же причинам.
Кстати, вы также можете полностью забыть о типе, используемом для индексов, и просто использовать итераторы:
for (vector<int>::iterator it = ivec.begin(); it != ivec.end(); ++it)
*it = 0;
или итераторы + <algorithm>
:
std::fill(ivec.begin(), ivec.end(), 0);
ЭтиДва варианта работают независимо от контейнера ivec
, поэтому вам не нужно ничего менять в коде, если вы решите изменить тип контейнера.
С vector
вы также можете использовать метод assign
(как предложено в другом ответе):
ivec.assign(ivec.size(), 0);