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

  Юрий  | 

  Обновл. 28 мая 2019  | 

 18651

 ǀ   4 

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

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

Введение в std::array

Представленный в 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 (99 оценок, среднее: 4,83 из 5)
Загрузка...

Комментариев: 4

  1. Аватар Арман:

    Ну конечно array будет знать свой размер , если указывать его в параметрах :

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

    1. Аватар Мгер:

      Не совсем то что ты хочешь, но вот еще как можно сделать:

  2. Аватар Андрей:

    А как на счет двумерного массива?

    1. Юрий Юрий:

      Двумерный массив объявляется как:

      Здесь myarray — это название вашего двумерного массива, а сам двумерный массив создается с помощью вложенного массива (т.е. один внутри другого).

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

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

telegram канал
НОВОСТИ RAVESLI