Классы контейнеров C++<array>

Стандарт C++11 ввёл<array>Заголовочный файл предоставляет контейнер массива фиксированного размера, который обеспечивает лучшую типобезопасность и характеристики управления памятью по сравнению с массивами в C.

std::arrayЭто шаблонный класс в стандартной библиотеке C++, определённый в<array>В заголовочном файле.std::arrayШаблонный класс предоставляет массив фиксированного размера, размер которого определяется во время компиляции и не может быть изменён динамически.

Синтаксис

std::arrayБазовый синтаксис выглядит следующим образом:

#include <array>

std::array<T, N> array_name;
  • T— это тип элементов массива.
  • NЭто размер массива, и он должен быть неотрицательным целым числом.

Объявление и инициализация

<array>Размер должен быть определён во время компиляции и не может изменяться динамически. Пример использования:

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {1, 2, 3, 4, 5}; // 声明一个定长为5的int数组
    return 0;
}

Особенности

  • Типобезопасность:std::arrayОбеспечивает проверку типов, избегая проблем с типобезопасностью массивов языка C.
  • Фиксированный размер: размер массива определяется во время компиляции и не может быть изменён во время выполнения.
  • Непрерывная память:std::arrayЭлементы хранятся в памяти непрерывно, что обеспечивает эффективный доступ к элементам.
  • Стандартный контейнер:std::arrayпредоставляетstd::vectorПохожие интерфейсы, такие какsize(), at(), front(), back()и т. д.

Пример

Ниже приведён пример использованияstd::arrayПростой пример, включая результаты вывода.

Пример

#include <iostream>
#include <array>

int main() {
    // Создать std::array, содержащий 5 целых чисел
    std::array<int, 5> myArray = {1, 2, 3, 4, 5};

    // Использовать цикл for на основе диапазона для перебора массива
    for (const auto& value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    // Доступ к элементам массива по индексу
    std::cout << "Элемент с индексом 2: " << myArray.at(2) << std::endl;

    // Получить размер массива
    std::cout << "Размер массива: " << myArray.size() << std::endl;

    // Изменить элементы массива
    myArray[3] = 10;

    // Снова пройдите по массиву, чтобы отобразить изменённые элементы
    for (const auto& value : myArray) {
        std::cout << value << " ";
    }
    std::cout << std::endl;

    return 0;
}

Вывод:

1 2 3 4 5 
Element at index 2: 3
Array size: 5
1 2 3 10 5 

Общие функции-члены

Ниже приведены<array>Некоторые часто используемые функции-члены в:

Функция Описание
at(size_t pos) Возвращает элемент в указанной позиции с проверкой границ
operator[] Возвращает элемент в указанной позиции без проверки границ
front() Возвращает первый элемент массива
back() Возвращает последний элемент массива
data() Возвращает указатель на данные массива
size() Возвращает размер массива (фиксированный и неизменный)
fill(const T& value) Устанавливает все элементы массива в указанное значение
swap(array& other) Обменивает содержимое двух массивов
begin() / end() Возвращает итераторы begin/end массива

Пример

1. Базовые операции

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr = {10, 20, 30, 40, 50};

    std::cout << "Элементы массива: ";
    for (int i = 0; i < arr.size(); ++i) {
        std::cout << arr[i] << " ";
    }
    std::cout << std::endl;

    // Получить первый и последний элементы
    std::cout << "Первый элемент: " << arr.front() << std::endl;
    std::cout << "Последний элемент: " << arr.back() << std::endl;

    return 0;
}

Использование at и проверки границ

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr = {1, 2, 3};

    try {
        std::cout << arr.at(2) << std::endl;  // Обычный вывод
        std::cout << arr.at(5) << std::endl;  // Выход за границы, выбрасывает исключение
    } catch (const std::out_of_range& e) {
        std::cout << "Исключение: " << e.what() << std::endl;
    }

    return 0;
}

3. Использование fill для заполнения элементов

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 5> arr;
    arr.fill(100);  // Установить все элементы в 100

    std::cout << "Заполненный массив: ";
    for (const auto& elem : arr) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

4. Обмен массивами

Пример

#include <iostream>
#include <array>

int main() {
    std::array<int, 3> arr1 = {1, 2, 3};
    std::array<int, 3> arr2 = {4, 5, 6};

    arr1.swap(arr2);

    std::cout << "Массив 1: ";
    for (const auto& elem : arr1) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    std::cout << "Массив 2: ";
    for (const auto& elem : arr2) {
        std::cout << elem << " ";
    }
    std::cout << std::endl;

    return 0;
}

Сравнение с другими типами массивов

Особенностиstd::arrayМассивы в стиле Cstd::vector
SizeФиксируются во время компиляцииФиксируются во время компиляцииДинамически изменяемый
Проверка границat()Обеспечивает проверку границОтсутствуетat()Обеспечивает проверку границ
Управление памятьюВыделение в стекеВыделение в стекеВыделение в куче
ПроизводительностьЭффективныйЭффективныйНиже (динамически выделяемый)
interfaceПоддерживает стандартный интерфейс STLНе поддерживает стандартный интерфейс STLПоддерживает стандартный интерфейс STL

std::arrayЭто очень полезный контейнер в стандартной библиотеке C++, предоставляющий массивы фиксированного размера с преимуществами типобезопасности и управления памятью. Из приведённых выше примеров видно, как создавать, получать доступ и изменятьstd::arrayэлементы. Для сценариев, требующих массивов фиксированного размера,std::arrayявляется очень хорошим выбором.

Другие расширения