Есть ли какая-то функция типа 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 - это тип данных, который настолько глуп, что даже не знал, сколько элементов он получил". Когда массив распадается на указатель, нет способа узнать, сколько элементов там, где находится "массив".