Есть ли какая-то функция типа std:: size()?
Для встроенного массива x произвольного типа T существуют функции std::begin()
и std::end()
, которые я могу вызвать, но почему нет std::size()
? Кажется странным не иметь этого.
Я мог бы использовать std::end(x)-std::begin(x)
, но все равно std::size(x)
будет лучше.
Да, я знаю классы std::vector
и std::array
. Это всего лишь вопрос о том, почему что-то простое, как это пока недоступно в STL.
Ответы
Ответ 1
Здесь std::extent
, который должен применяться к типу массива:
#include <type_traits>
int a[12];
assert(std::extent<decltype(a)>::value == 12);
В качестве альтернативы вы можете использовать std::distance(std::begin(a), std::end(a))
.
Первое явно является постоянным выражением, хотя на практике последнее также может быть составлено статически.
Наконец, всегда есть доморощенное решение:
template <typename T, std::size_t N>
constexpr std::size_t array_size(T const (&)[N])
{ return N; };
Ответ 2
Просто заметьте, чтобы люди знали, что N4280 "Не членский размер() и больше (версия 2)" был принят в С++ 17 Рабочий проект. Это включает std::size()
, а также std::empty()
и std::data()
.
Ответ 3
Алгоритм STL работает на итераторах, а не на любом контейнере, размер контейнера STL должен начинаться и заканчиваться, что не имеет смысла. Для таких мы уже имеем std::distance
Ответ 4
Я полагаю, вы имеете в виду C-подобные массивы. Ответ, как сказал Бьярне Страуструп, заключается в том, что "массив в C - это тип данных, который настолько глуп, что даже не знал, сколько элементов он получил". Когда массив распадается на указатель, нет способа узнать, сколько элементов там, где находится "массив".