|
|||||||
Что нового и удобного появилось в стандарте C++11 - Обертка над стандартными массивами
Время создания: 09.09.2019 02:16
Раздел: Компьютер - Программирование - Язык C++ (Си++) - Стандарт C++11 и выше
Запись: xintrea/mytetra_syncro/master/base/1562613868qmxycpgh93/text.html на raw.github.com
|
|||||||
|
|||||||
Обертка над стандартными массивами В 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 — это название итогового двумерного массива, а сам двумерный массив создается с помощью вложенного массива (т.е. один внутри другого). |
|||||||
Так же в этом разделе:
|
|||||||
|
|||||||
|