Урок 94. Введение в std::array

   ⁄ 

 Обновлено 5 Ноя 2017

  ⁄   

В предыдущих уроках мы подробно говорили о фиксированных и динамических массивах. Хотя они очень полезны и активно используются в C++, у них также есть недостатки: фиксированные массивы распадаются в указатели, теряя информацию о своей длине, в динамических массивах проблемы могут возникнуть с освобождением памяти и с попытками изменить размер.

Поэтому в стандартную библиотеку C++ добавили функциональности, которые упрощают процесс управления массивами: std::array и std::vector. В этом уроке мы рассмотрим std::array, а в следующем std::vector.

Введение в std::array в C++11

Представленный в C++11, std::array — это фиксированный массив, который не распадается в указатель при передаче в функцию. std::array определяется в заголовочном файле <array>, внутри пространства имен std.

Объявление переменной std::array следующее:

Подобно обычным фиксированным массивам длина std::array должна быть установлена во время компиляции.

std::array можно инициализировать с использованием списка инициализаторов или uniform инициализации:

В отличие от стандартных фиксированных массивов, в std::array вы не можете пропустить (не указывать) длину массива:

Также можно присваивать значения массиву с помощью списка инициализаторов:

Доступ к значениям массива через оператор индекса осуществляется как обычно:

Так же, как и в стандартных фиксированных массивах, оператор индекса не выполняет никаких проверок на диапазон. Если указан недопустимый индекс, то произойдут плохие вещи.

std::array поддерживает вторую форму доступа к элементам массива (функция at()), которая осуществляет проверку диапазона:

В примере выше вызов myarray.at(1) проверяет, есть ли элемент массива 1, и поскольку он есть, то возвращается ссылка на этот элемент. Затем мы присваиваем ему значение 7. Однако вызов myarray.at(8) не срабатывает, так как элемента 8 в массиве нет. Вместо возвращения ссылки, функция at() выдает ошибку, которая завершает работу программы (примечание: на самом деле выбрасывается исключение типа std::out_of_range. Об исключениях мы поговорим в следующих главах). Поскольку проверка диапазона выполняется, то at() работает медленнее (но безопаснее), чем оператор [].

std::array автоматически делает все очистки после себя, когда выходит из области видимости, поэтому нет необходимости прописывать это вручную.

Размер и сортировка

С помощью функции size() можно узнать длину массива:

Результат:

length: 4

Поскольку std::array не распадается в указатель при передаче в функцию, то size() будет работать, даже если его вызвать из другой функции:

Результат тот же:

length: 4

Обратите внимание, стандартная библиотека использует термин «размер» для обозначения длины массива — не путайте это с результатами выполнения оператора sizeof() с обычным фиксированным массивом, когда возвращается фактический размер массива в памяти (размер элемент * длина массива).

Также обратите внимание, мы передаем std::array по ссылке (константной). Это делается для того, чтобы компилятор не делал копию массива, когда массив передается в функцию (по соображениям производительности).

Правило: Всегда передавайте std::array по обычной или по константной ссылке.

Поскольку длина массива всегда известна, то циклы foreach также можно использовать с std::array:

Вы можете отсортировать std::array, используя std::sort, который находится в заголовочном файле <algorithm>:

Результат:

1 2 4 7 8

Функция сортировки использует итераторы, которые мы еще не рассматривали. О них мы поговорим несколько позже.

Итого

std::array – это отличная замена стандартных фиксированных массивов. Они более эффективны, так как используют меньше памяти. Единственными недостатками std::array по сравнению со стандартными фиксированными массивами являются немного неудобный синтаксис и то, что нужно явно указывать длину массива (компилятор не будет вычислять её за нас). Но это сравнительно незначительные нюансы. Мы рекомендуем использовать std::array вместо стандартных фиксированных массивов в любых нетривиальных задачах.

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (4 оценок, среднее: 4,50 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *