#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 здесь уместны два из них:
-Wconversion
предупреждает о преобразованиях, которые могут изменить значение. При преобразованиях целых чисел это может произойти, когда тип назначения меньше исходного (напримерint32_t y = 1000; int16_t x = y;
, ).- Преобразования со знаком и без знака, в которых адресат без знака (например
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 .