Есть ли функция для получения размера элемента std :: vector напрямую? - PullRequest
0 голосов
/ 09 ноября 2019

vector::size() дает количество элементов в векторе, но как мне получить размер одного элемента?

Вот что я имею в виду на практике:

std::vector<char>   --> 1
std::vector<int>    --> 4
std::vector<double> --> 8

Следующая строка работает, только если вектор имеет хотя бы один элемент

int size_of_element = sizeof(myVec[0]);

Если в векторе нет элементов, он не будет работать. Есть ли какая-нибудь функция для получения размера типа напрямую?

Редактировать: Хорошо, очевидно, это работает.

1 Ответ

2 голосов
/ 09 ноября 2019

Как все говорили в комментариях:

sizeof(std::vector<double>::value_type)

или

sizeof(decltype(myVec)::value_type)

Последний требует C ++ 11, но не требует повторного ввода типа std::vector.

В отличие от sizeof(myVec[0]) это всегда дает правильный результат. Это не относится к первому, потому что есть исключение для std::vector<bool>, которое ведет себя иначе, чем другие std::vector, и в частности myVec[0] не возвращает bool&.

Кроме тогоТочка sizeof(myVec[0]) всегда в порядке, хотя. Даже если вектор будет пустым в точке, где вы используете это выражение, аргумент sizeof является неоцененным операндом. Выражение myVec[0] фактически не вычисляется, а элемент вектора фактически не принимается. Вместо этого вычисляется только тип результата, и по типу можно определить размер типа. Таким образом, здесь нет причины для неопределенного поведения, если вектор пуст. И как это может быть? sizeof оценивается во время компиляции, но во время компиляции мы можем даже не знать, что находится в векторе. Вектор как объект обычно даже не существует во время компиляции.

...