Можно ли получить доступ к векторным элементам с целочисленным индексом?

#c

#c

Вопрос:

У меня есть несколько целочисленных переменных и вектор. Мне нужно использовать целочисленную переменную в качестве индекса в векторе.

Можно ли просто сказать some_vector[some_integer] ?

Или мне нужно каким-то образом преобразовать целое число в тип размера?

Комментарии:

1. Все, что вам нужно сделать, это убедиться, что индекс действителен для контейнера.

2. Да, он автоматически преобразуется в векторные size_type

3. Вы даже пытались?

Ответ №1:

Да, is будет преобразован в size_t без каких-либо предупреждений или ошибок. Но остерегайтесь отрицательных значений. Если ваше int i значение отрицательное, преобразование даст std::numeric_limits<size_t>::max() 1 - abs(i) результат, обычно очень большое число, что может привести к нежелательным последствиям. Поэтому, если индекс может быть отрицательным, проверьте его перед индексацией.

UPD: Строго говоря, может быть предупреждение в зависимости от ваших флагов компилятора. В случае g здесь уместны два из них:

  1. -Wconversion предупреждает о преобразованиях, которые могут изменить значение. При преобразованиях целых чисел это может произойти, когда тип назначения меньше исходного (например int32_t y = 1000; int16_t x = y; , ).
  2. Преобразования со знаком и без знака, в которых адресат без знака (например int16_t y = -1; uint32_t x = y; ) или адресат того же размера, что и источник (например unsigned int y = UINT_MAX; int x = y; ), также могут изменить значение, и в C -Wconversion выдает предупреждение, но в C вам нужно добавить -Wsign-conversion , чтобы оно появилось.

Я подозреваю, что они сделали различие в C именно потому, что люди обычно индексируют std::vector с помощью int и должны были бы сделать слишком много static_cast s, чтобы избавиться от предупреждения, если оно появилось в этом случае.

Microsoft CL покрывает первый случай предупреждением C4244, включенным с помощью /W3 или / W4, а для второго случая я не смог найти переключатель предупреждения. Если кто-то знает, пожалуйста, сообщите в комментарии.

AFAIK, стандарт C явно не требует size_t , чтобы он был равного размера или больше int . Но я не знаю ни одной платформы, где это не так. Таким образом, преобразование из int в size_t попадает во вторую категорию.

Подводя итог: скорее всего, вы не получите предупреждение о int size_t преобразовании в C , как я уже говорил ранее, если вы не используете g с -Wsign-conversion switch .