MyTetra Share
Делитесь знаниями!
Что нового и удобного появилось в стандарте C++11 - Обертка над стандартными массивами
09.09.2019
02:16
Раздел: Компьютер - Программирование - Язык C++ - Стандарт C++11 и выше

Обертка над стандартными массивами


В C++11 появился класс std::array. В чем его отличие от более привычного std::vector? Вектор - это динамический массив. А класс std::array - это, по сути, обертка над стандартными C/C++ массивами.


Инициализация std::array всегда происходит двумя значениями:


  • тип, который хранится в ячейке
  • размер (длинна) массива



Объявление


Выглядит объявление массива так:



#include <array>


std::array<int, 4> myarray; // объявляем массив типа int длиной 4



Также как и для обычного массива, размер массива должен быть известен в момент компиляции. Задать размер массива через переменную невозможно, только через константу.


Массив можно сразу инициализировать значениями. Синтаксис следующий (два варианта):



std::array<int, 4> myarray = { 8, 6, 4, 1 }; // список инициализаторов

std::array<int, 4> myarray2 { 8, 6, 4, 1 }; // uniform инициализация



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



std::array<int, > myarray = { 8, 6, 4, 1 }; // Будет ошибка



Проверка на диапазон


Так же как и в стандартных фиксированных массивах, оператор индекса не выполняет никаких проверок на диапазон. Другими словами, при доступе к элементам масива через скобки [ ], проверки на диапазон не производятся. Но у массива std::array есть метод at(), который таки проверяет диапазон. Еще интересно то, что метод at() можно использовать как в правой, так и в левой части выражения:



std::array<int, 4> myarray { 8, 6, 4, 1 };

myarray.at(1) = 7; // элемент массива под номером 1 - корректный, присваиваем ему значение 7

myarray.at(8) = 15; // элемент массива под номером 8 - некорректный, получим ошибку времени выполнения



Такое поведение (работа в левой части выражения) возможно благодаря тому, что метод at() возвращает ссылку на элемент массива.


При обращении к элементу за границами массива (выход за границу массива), метод at() генерирует исключение типа std::out_of_range.


Следует понимать, что метод at() работает медленнее, чем простое обращение к элементу массива через индекс (т. е. через оператор "квадратные скобки").



Использование стандартных циклов и алгоритмов с str::array


Массивы std::array можно сортировать стандартным алгоритмом std::sort:



#include <iostream>

#include <array>

#include <algorithm> // для std::sort

int main()

{

    std::array<int, 5> myarray { 8, 4, 2, 7, 1 };

    std::sort(myarray.begin(), myarray.end()); // сортировка массива по возрастанию

// std::sort(myarray.rbegin(), myarray.rend()); // сортировка массива по убыванию


    for (const auto &element : myarray)

        std::cout << element << ' ';

    return 0;

}



Здесь в функцию sort() передаются данные для итератора, который будет производить обход массива.


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



std::array<int, 4> myarray { 8, 6, 4, 1 };

for (auto &element : myarray)

    std::cout << element << ' ';



Объявление двумерного массива


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



std::array< std::array<int, 9>, 10 > myarray;



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


 
MyTetra Share v.0.52
Яндекс индекс цитирования